워게임/247CTF

[247CTF] THE WEB SHELL - 포렌식 / Wireshark / Tshark

SecurityMan 2023. 10. 28. 11:00

 

247CTF 에서 제공하는

 

MODERATE 난이도의 네트워크 포렌식 문제

 

반응형

 

 

문제에서는 web_shell.pcap 파일이 주어진다.

 

 

해당 파일을 Wireshark 로 열어보면

 

특정 웹 서버에 대해서 brute force 하는 듯한 흔적을 찾을 수 있다.

 

uri 를 계속 바꿔가면서 GET 요청을 보내는데,

 

돌아오는 응답은 모두 404 인것이 보인다.

 

 

 

쭉 내려보다가

 

/uploader.php 경로에서 200 OK 가 떨어진걸 확인할 수 있었다.

 

200 OK를 확인한 후 POST 패킷을 이용해 어떤 데이터를 보내고 있다.

 

 

해당 패킷을

 

우클릭 - Follow - HTTP Stream 을 해보니

 

 

뭔가 난독화된 PHP 코드를 전송하고 있는데

 

자세히 보면 그렇게 어렵지 않다.

 

 

보기 쉽게 쓰면 위와 같은데

 

먼저 str_replace 를 이용해서 eq 문자열을 제거해주고,

 

그다음 $O $q $C $V $Z 순으로 쓴 뒤 거기서 [Z 문자열을 제거해주면 된다.

 

 

그럼 이런 PHP 코드가 나온다.

 

대충 보아하니 웹쉘로 어떤 명령어를 보낼때,

 

zlib 압축하고 base64 인코딩을 한 뒤, 

 

앞뒤로 $p, $kh, $kf 문자열을 붙혀서 전송하는 듯 하다.

 

 

웹쉘이 업로드 된 이후로는

 

/uploads/owned.php 경로로 계속 POST 패킷을 보내는데

 

 

해당 패킷을 자세히 열어보면

 

PHP 코드에서 확인한 패턴이 그대로 보인다.

 

그럼 다 날려버리고 가운데 있는 문자열만 디코딩해서 사용하면 될 것 같다.

 

 

디코딩할땐 이미 나와있는 코드를 활용해 역순으로 구성해주면 된다.

 

PHP SANDBOX 에서 먼저 테스트 해봤는데

 

무슨 의민지 모르겠지만 28520 이 디코딩 되어 출력된 것이 보인다.

 

이제 저 부분만 다 추출해본다.

 

 

tshark를 이용한다.

 

tshark는 Wireshark의 커맨드라인 버전이라고 생각하면 된다.

 

tshark는 칼리 리눅스를 설치하면 안에 내장되어 있다.(https://hackingstudypad.tistory.com/58)

 

tshark 명령어로 실행 가능하며

 

-r 옵션으로 불러올 패킷 파일을 지정해준다.

-Y 옵션은 필터링할 패킷을 선택한다. 여기선 응답코드가 200인 패킷이다.

-T 옵션은 텍스트 출력형식을 지정하는데 fields 형식으로 지정해준다.

-e 옵션은 표시하고자 하는 필드를 지정할 수 있다. -T 옵션과 같이 쓰이는데 text 필드를 지정했다.

 

 

그럼 이렇게 좌라락 추출된다.

 

 

불필요한 부분 다 날리고 실제 쿼리 부분만 남겨준다.

 

import base64
import zlib

k = "81aebe18"

def x(t, k):
    c = len(k)
    l = len(t)
    o = bytearray()
    i = 0

    while i < l:
        for j in range(c):
            if i < l:
                o.append(t[i] ^ ord(k[j]))
                i += 1

    return bytes(o)

file_path = "./query" 

with open(file_path, "r") as file:
    for line in file:
        encoded_data = base64.b64decode(line.strip())
        decrypted_data = x(encoded_data, k)
        decompressed_data = zlib.decompress(decrypted_data).decode('utf-8')
        print(decompressed_data)

 

방금전 php 코드를 기반으로 해서

 

python 으로 위와 같이 작성해준다.

 

파일을 한줄씩 읽어 명령어를 디코딩 해주게 된다.

 

내용은 똑같다.

 

 

실행시켜 봤는데

 

뭔가 잘못됐다 싶었다.

 

id 명령어 결과, ls 명령어 결과도 보이고

 

y_flag_here.txt 파일도 보이는데

 

이상한 숫자만 덩그러니 있고 플래그는 안보였다.

 

 

그래서 패킷을 다시 봤는데

 

request 패킷에서도 똑같이 $kh, $kf 패턴이 보였다.

 

 

다시 보니 php 에서도 정규식 패턴으로 작성해 놓은것이 보였다.

 

 

같은 방법으로 request 패킷에 있는 부분도 발라내 준다.

 

 

그럼 이렇게 명령어가 보인다.

 

5자리 숫자는 그냥 의미없는 echo 였고

 

두자리 숫자가 플래그의 조각이었다.

 

순서는 뒤죽박죽이다.

 

하나씩 찾아서 맞춰준 뒤

 

 

디코딩하면 플래그를 찾을 수 있다.

반응형