Web - 실습

pingservice

곽도우너 2023. 3. 21. 21:19

초기화면

초기화면을 보면 /source를 확인하라고 나와있다.

 

 

http://localhost:5006/source

/source로 이동하니 소스 코드들을 확인할 수 있었다.

해당 소스에서 os 명령어를 사용한다는 것을 확인할 수 있었으며, os라는 단어를 검색하여 쭉 확인하다보니 os 명령어를 실행할 수 있는 부분이 /execute라는 것도 알아낼 수 있었다.

 

 

/execute 부분을 확인해 보니 url에 넣으면 cd 명령어를 통해  /app/mypinguser/"+directory+" 로 이동한 다음  ping -c 2가 실행된다. 또한, 뒤에 있는 ip_에 ip의 값이 들어간다는 것도 알 수 있었다.

그래서 바로 /execute를 이용하여  localhost:5006의 ip 주소인 127.0.0.1을 넣어보았다.

 

 

 

그랬더니 아무것도 뜨지 않았다. 

무엇이 문제일까 다시 소스 코드를 확인하다가 ping -c 2에서 2 뒤에 띄어쓰기가 없는 것을 발견할 수 있었다.

만약 띄어쓰기가 없는 상태에서 ip에 시스템 명령어를 입력시키면 "cd /app/mypinguser/"+directory+" && ping -c 2명령어.read()로 동작하기 때문에 입력한 시스템 명령어가 제대로 실행되지 않을 것이다. 

그렇기 때문에 띄어쓰기를 앞에 넣어줘야 한다.

 

 

 

http://localhost:5006/execute?ip=%20127.0.0.1

다시 띄어쓰기를 넣은 뒤 ip 주소를 넣으니 다음처럼 나오는 것을 확인할 수 있었다. 

이제 제대로 작동된다는 것을 확인했으니 시스템 명령어를 이용해서 flag를 찾을 차례이다.

가장 쉽게 찾을 수 있는 방법이 ls 명령어를 이용하여 flag를 찾고 cat 명령어를 이용하여 flag의 내용을 출력하는 것이다.

그래서 바로 ls 명령어를 사용해 보았다.

 

 

 

http://localhost:5006/execute?ip=%20127.0.0.1%26%26ls

ls 명령어를 입력하였으나 변함없는 것을 볼 수 있었다.

ls 명령어는 현재 디렉토리를 확인하는 명령어인데 현재 디렉토리에는 아무것도 없는 것을 확인할 수 있었다.

분명 어딘가에 flag가 숨어있을 텐데 그걸 어디서 확인할 수 있을까 고민하다가 그렇다면 가장 위에 있는 root에 있는 디렉토리 목록을 출력하면 보이지 않을까라는 생각을 하였다.

 

 

 

http://localhost:5006/execute?ip=%20127.0.0.1%26%26ls%20%2f

루트 디렉토리를 출력하는 명령어는 ls / 이고, 이를 인코딩하면 ls%20%2f이다.

(/ : %2f)

그랬더니 다음처럼 파일들이 쭉 나왔다.

파일 이름들 중에 직접적으로 flag라고 나와있는 것이 없었다.

파일들을 쭉 보다 보니 제일 의심스러운 secret에 flag가 숨겨있지 않을까 하는 생각을 하였고 바로 확인해 보았다.

 

 

 

http://localhost:5006/execute?ip=%20127.0.0.1%26%26ls%20%2fsecret

/secret 경로의 디렉토리에 있는 파일 목록을 출력하기 위한 명령어인 'ls /secret'를 사용해 보았다.

ls /secret를 인코딩하면 ls%20%2fsecret 이다.

해당 명령어를 실행해 주니 secret에 flag가 들어있는 것을 볼 수 있었다.

이제 flag가 어디 있는지도 찾았으니 마지막으로 flag의 내용을 출력해 주면 된다.

 

 

 

http://localhost:5006/execute?ip=%20127.0.0.1%26%26cat%20%2fsecret%2fflag

파일 내용을 출력해 주는 명령어인 cat을 사용하여 flag의 내용을 출력해 주었다.

명령어는 'cat /secret/flag'이고, 이를 인코딩 해주면 'cat%20%2fsecret%2fflag'이다

해당 명령어를 실행하니 flag의 내용을 확인할 수 있었다.

seKUCTF{@@D0nt_w0RRy_Th12_i2_e@sY_1_@@}

 

 

 

+) 쿼리스트링 : 사용자가 웹으로 데이터를 전달하는 가장 단순하고 널리 사용되는 방법이다.
URL 주소 뒤에 입력 데이터를 함께 저공한다.
- ? : 쿼리스트링의 시작을 나타내는 기호
- & : 여러 쌍의 변수와 값을 전달할 경우 &로 구분한다.