Reconnaissance
nmap -sV $IP
- 8000번 포트의 웹서비스에 접근하여 코드입력창이 보이길래 ssti인가 확인해봤는데 바로 걸렸다.
- {{7*’7’}} 까지 되는거 보니 jinja2나 Twig인거같다.
- 근데 생각해보니까 코드 에디터라서 그냥 되는거같기도하다 (기본적인 payload들이 아예 안먹힘)
- 메인 페이지의 Download APP 버튼을 통해 소스코드를 얻어낼 수 있다.
- 의심가는 부분을 확인해보았는데 절묘하게 CVE에 맞춘 환경이 구성되어 있었고, 때문에 js2py rce CVE-2024-28397라고 확신했다.
Exploitation
- payload를 직접 웹사이트에 올려봤지만 잘 되지 않아서 python script로 작성하였다.
- 에러가 떴지만
js2py.eval_js(code) 이부분이 실행 됐기에 성공적으로 리버스셸을 획득하였다.
- 하지만 marco의 계정도 얻어내야 플래그를 획득할 수 있다.
- app/instance/users.db 내에서 marco 계정의 비밀번호 해시값 획득
- sweetangelbabylove 로 크랙 성공!
Privilege Escalation
- sudo -l을 쳐보면 marco가 비밀번호 없이 root권한으로 /usr/local/bin/npbackup-cli를 실행할 수 있게 나온다.
sudo /usr/local/bin/npbackup-cli
- 한번 실행해보면 root로 돌리는데 configuration file없이는 돌릴 수 없다는 경고문이 떠서 내부 코드를 한번 봐야한다.
- 여기서
currunt_dir/npbackup.conf 경로를 받는걸 확인할 수 있다.
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/npbackup.conf -b
- 일단 --config-file 파라미터로 기존에 marco 홈디렉토리에 존재했던 npbackup.conf파일을 넣으니까 이런식으로 작동되었다.
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/npbackup.conf --ls
- --ls 옵션을 주니 /home/app/app내부에 있는 파일들이 백업되는걸 확인할 수 있었다.
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/npbackup.conf --dump /home/app/app/requirements.txt
- 그리고 --dump 옵션과 백업된 파일 경로를 주면 백업된 파일 내용을 확인할 수 있다 (root로!!)
- 이제 기존 npbackup.conf파일에서 paths 값을 /root로 바꾸고 --dump 옵션으로 root.txt를 확인하여 플래그를 획득하면 될것이다.
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/root.conf --check-config-file
- 새로운 conf 파일에 대해 --check-config-file로 유효성 검사를 먼저 해줘야 진행이 되었다.
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/root.conf -b -f
- -b 만 주게되면 최근 1일동안 backup한 내역이 있으면 backup을 실행하지 않는다. 그래서 -f로 강제로 해줘야했다.
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/root.conf --ls
- 성공적으로 /root 하위의 내용들을 백업한걸 확인할 수 있다!!
sudo /usr/local/bin/npbackup-cli --config-file /home/marco/root.conf --dump /root/root.txt