[PG Play] Amaterasu (Linux_Fundamental)
1. 시작에 앞서
이번에도 풀어본 PGP 문제!
이번엔 Amaterasu라는 것을 풀어보았고, 이번에야말로? 쉬웠다.
2. 초기 침투 : 정찰 및 정보 수집 (Reconnaissance & Enumeration)
시작과 동시에 nmap을 돌려 포트 스캐닝을 진행했고, 21/ftp가 열려있는 것을 확인 하였기에
난 anonymous 로그인 된다고 해서 바로 접속을 했지.
근데 그 아래를 안 읽었단 말이지…
Can't get directory listing: TIMEOUT
이 때문인지 어떤 방법을 써봐도, 적어도 내가 아는 방법으론 ls를 하던가 다른 명령어를 쓰는 것이 불가능했다.
게다가 다른 포트에 열린 서비스에 들어가볼까 해도 다 closed여서 접근도 안되고..
그래서 아예 nmap을 전체 포트 단위로 스캔해보기로 했다.
그러자! 드러난 open 포트들!!
조금 더 자세히 알기 위해 -sV -sC와 포트를 지정해줘 전체를 스캔해보았을 때 http 사이트들을 발견할 수 있었다!!!
접속을 해보니 이렇게 firefox? 그림이 있는 사이트가 드러나기도 했고
그런데 다른 포트로 접속한 부분에선 보이는게 없기 때문에
이렇게 사이트도 확인을 해보았지만 어음…. 모르겠다
혹시나 하는 마음에 두 사이트에 dirsearch로 dir 브루트 포싱을 돌려보았고
그 결과 notfound가 떴던 사이트에 /help와 /info를 찾아낼 수 있었다.
보아하니 API 서버였던 것이다!
게다가 이렇게 친절하게도 어떻게 쓸 수 있는지 API 리스트를 던져주는게 아니겠나?!
특히 그 중 내 눈에 보인건 /file-upload였다. 여기서 ssh 키를 업로드 할 수만 있으면? 바로 호로록
3. 초기 침투 (Initial Foothold / Exploitation)
그래도 일단은 다른 기능들도 써보기 위해 file-list?dir=/로 루트 경로를 살펴봤는데 잘 잡혔고.
그 중엔 /root 폴더도 있기에 한번 찾아가봤으나 아무래도 권한 문제가 있는 것인지 접근할 수 없었다.
고로 우린 ssh를 넘겨준다고 해도 최대 user 계정으로 접근 가능할 것이라는 의미!
사실 그보다 /home 경롤르 살펴 보았을 때 alfredo의 계정을 발견할 수 있었고, 게다가 접근도 가능했기에 local.txt는 바로 읽을 수는 있었다.
테스트 삼아서 그냥 .txt를 업로드 해보았더니 정말로 들어갔기에 ssh 키를 바꿔치기 하면 되겠구나! 라고 알 수 있었다.
고로 ssh-keygen을 이용해 키를 만들고 authorized_keys로 pub키를 이름 바꿔준 뒤에
넘겨주면? 바로 그냥 filetype 에러가 발생한다.
올릴 수 있는 파일 타입이 정말 기본적인 txt, pdf, png, jpg, jpeg, gif 라는데
이렇게 클로드의 자세한 설명 처럼 진행 하여 이름을 속여 저장할 수 있었다.
솔직히 내가 이거 할 땐 그냥 인터넷에서 이런 방법이 있더라 하고 진행을 했었는데 막상 원리를 뜯어보니까 이거 나 못 풀었을 수도 있겠다 싶다 ㅋㅋㅋㅋ
이런 취약점을 TOCTOU 비슷한 느낌이라고 이해하면 될 것 같다.
검사 대상과 사용(저장) 대상이 불일치 + Path traversal 미차단
그렇게 userflag를 얻어낼 수 있었다.
추가로 이건 내가 해깔려서 물어보고 알아낸 것.
나중에 이런 문제 나오면 또 여기 찾아와야겠다.
4. 권한 상승 (Privilege Escalation)
자 그럼 국룰인 권한 상승을 위한 sudo -l을 입력 해보았으나? 난 비번 모르거든…
그렇기에 지금 계정으로 getcap -r을 찍어보았고 근데 솔직히 그래도 모르겠기에
/etc/crontab을 읽어보았더니 여기 root 권한으로 실행되는 /usr/local/backup-flas.sh가 있네?
그래서 .sh를 읽어보았더니 (내가 권한이 있어 읽을 수도 있었음)
내가 쓰기 가능한 폴더인 /home/alfredo/restapi가 $PATH 맨 앞에 나오고
tar를 절대경로 없이 호출 하는데다가? *가 있어서 와일드 카드로 모두 다 실행이네?
바로 그냥 tar의 PATH 하이재킹을 해버리기 위해 /home/alfredo/restapi에 tar이라는 이름의 rootbash로 올려줄 루트 권한 스크립트를 만들어놓고
기다리면?
어째서?!! 안 되는 것이냐?? root 권한을 갖고 있으면서!!! 왜?? -p도 잘 했는데!!
는 확인을 해보니 SUID는 제대로 걸렸지만 findmnt /tmp로 /tmp 폴더를 확인해보니 nosuid로 마운팅이 되어버리면서 커널이 SUID를 씹어버리는 상황이 있었다.
이게 Fedora의 기본 값이라고 하니 기억해둬야겠다.
그래서 다시 찾아보다가 그럼 일단 권한 상승을 위한 경로는 만들어지니까 내꺼는? 이라는 생각에 /home/alfredo를 확인해보니 nosuid가 없었다!
고로 이렇게 이전처럼 대신 경로만 내 폴더로 해서 실행 하면?
따단!! 루트 권한을 획득 할 수 있었다!!
아직도 1시간 컷이나 걸린다니… 조금만 더 공부를!!
마치며
Lab time이 13분으로 나오는데.. 저건 아마 내가 권한 상승 할 때를 의미하는 것 같고
실제론 1시간이니 말이지.
아니 근데 OSCP+ 강의 lab은 15점씩 주고 그럼서 PGP는 1시간 걸려 풀면 10점 주는거야? 너무하네!
이번 문제에서 쓴 내용들을 간단히 써보자면?
- 포트 은닉 - 기본 포트가 아니라 뒤에도 있었으
- FTP 래빗홀 - 접속은 되는데 아무것도 못 한다? 래빗홀 신호
- Path Traversal + 파일 업로드 검증 우회 - secure_filename()으로 경로 제거 해야 함 + os.path.realpath()로 업로드 루트를 벗어나는지도 검증 해야함!
- Cron + PATH Gijacking - 권한 상승
- nosuid 마운트 -
tmp가nosuid였던 해프닝 - findmnt로 한번씩 확인 해보기!
Try harder!!


































