[Codegate 2018] Misc – Impel Down

문제의 description은 별다른 내용이 없고 nc 호스트와 포트만 존재합니다.

서버에 접속해보면 python이 돌아가고 있으며, 전형적인 python jailbreak 문제인 것으로 예상해 볼 수 있습니다. 해당 스크립트는 약 10초가 지나면 timeout 되어 접속이 종료되며, 해당 시간 내에 flag를 획득해야 하는 형태입니다.


Name에 임의의 문자를 넣은 후 4가지 메뉴 중 하나를 선택하여 입력하면 해당 기능이 수행되며, “dig a”와 같이 untrusted input을 전달하게 되면 에러가 발생하게 됩니다.

에러 내용을 살펴보면 해당 work 변수에 우리가 입력한 명령이 들어가게 되며, 결과적으로 eval 함수를 이용해 “your.[명령]()”와 같은 형태로 명령이 실행됩니다. your은 클래스의 인스턴스라고 예상해 볼 수 있고, dig와 같은 명령들은 이에 속하는 함수들이라고 볼 수 있겠죠. 이 때 eval 함수를 사용하기 때문에 우리가 원하는 명령을 실행시킬 수 있는 가능성이 생겼습니다.

파이썬의 eval 함수에서는 ,(comma)를 이용하여 복수의 명령을 실행할 수 있습니다.

이런식으로 말이죠.

이 특성을 이용해 work 변수에 아래와 같은 명령을 삽입할 수 있습니다.

dig(), [임의 명령], your.dig

이와 같이 입력하게 되면 eval에 들어가는 명령은 “your.dig(), [임의 명령], your.dig()”가 될 것이며 이로 인해 dig 함수는 총 2번 실행되고, 그 사이에 우리가 원하는 명령을 수행할 수 있습니다.

dig,__import__(‘os’).system(‘ls’),your.dig

따라서 위와 같은 명령을 통해 쉘 명령을 내릴 수 있지만, 해당 스크립트에서는 _(underbar)가 들어갈 경우 필터링 후 종료시켜버리기 때문에 다른 방법을 찾아야 했습니다.

여기서 생각할 수 있는 것은 _를 사용하지 않고 os모듈을 import 하거나, 다른 변수에 값을 할당해 이를 eval로 실행하는 것이 될 것입니다. 1번 방법은 대회 중 떠오르지 않아 실패했지만 2번의 경우 스크립트 시작 당시 Name에 변수를 받지만 별다른 필터링이 적용되어있지 않아 이를 이용할 수 있겠다고 생각하였습니다. 따라서 Name에 __import__(‘os’).system(‘ls’)와 같은 쉘 명령을 실행시킬 수 있는 명령어를 입력 후 work에서 eval을 이용해 이를 실행시키는 형태로 진행하였습니다.

해당 writeup은 대회 종료 후 추출한 소스코드를 이용해 로컬에서 돌리고 있는 상황이라 로컬의 ls 결과가 출력되었습니다. 아무튼 이와 같은 형태로 쉘 명령을 실행시킬 수 있으며, “cat Impel_Down.py” 등의 명령을 통해 소스코드를 추출할 수 있습니다.

Impel_Down.py

 

소스코드를 살펴보면 FLAG 파일은 root 경로에 존재하며, 실행 시 FLAG를 얻을 수 있다고 합니다.

name : __import__(‘os’).system(‘/FLAG_FLAG_FLAG_LOLOLOLOLOLOL’)

work : dig,eval(name),your.dig

 

이와 같이 수행하게 되면 플래그를 얻어낼 수 있습니다.

 

FLAG : Pyth0n J@il escape 1s always fun @nd exc1ting ! 🙂

'CTF > CodeGate 2018 Qualifier' 카테고리의 다른 글

[Codegate 2018 Qualifier] Web – rbSql  (1) 2019.02.16
[Codegate 2018 Qualifier] Rev – RedVelvet  (0) 2019.02.16

Wargame.kr

Misc_650

pyc decompile



650점짜리 문제입니다. 정확한 분야를 정하기가 애매해서 Misc로 지정했습니다.

문제를 확인해보죠.



문제 페이지에 접속하면 서버 타임과 함께 bughela.pyc를 받을 수 있는 링크가 있습니다.

pyc파일을 받은 후 Easy Python Decompiler 툴을 이용하여 .py 파일로 변환시켜줬습니다.



bughela.py입니다.

소스를 확인해보니 %m/%d/HJEJSH 포맷으로 현재 로컬 타임을 받아옵니다.

그리고 start와 end 부분은 로컬 시, 로컬 분을 연산 한 결과로 집어 넣어줍니다.

하지만 로컬 타임과 서버 타임이 약 8분정도 차이나는 것을 확인 할 수 있습니다.



따라서 위와 같이 약간 변형을 시켜줍시다.

flag와 ok와 다를 때 die 함수로 가는 부분을 return ok로 바꾼 이유는 처음 함수에 접근했을 때 flag 값을 받아오기 위함입니다.



위는 bughela.py에서 GIVE_ME_FLAG 함수를 한번 호출하여 flag에 해당하는 값을 얻어오고, 그 값을 웹페이지에 요청하는 스크립트입니다.

5번째 라인의 두번째 GIVE_ME_FLAG 함수는 테스트를 위해 추가한 코드이니 신경 쓰지 않아도 무방합니다.



짠!

Key 값을 뱉어주네요.

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25
[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20

[H3X0R CTF 2016]

Misc_20

is_this_real_hex



대회 시작부터 공개되었던 20점짜리 misc문제입니다. 초반에 다들 이 문제만 푸셨었더라구요..

무슨 문제인지 확인 해 봅시다.



문제를 다운받으면 26바이트짜리 파일이 있습니다.



출력 해 보니 깨진 문자를 포함한 스트링이 출력됩니다.



문제가 hex가 관련되어있으니 hexdump로 hex값을 뽑아봅니다.



python으로 해당 hex값을 1부터 더해주는 스크립트를 작성해봤습니다.



더하는 결과값으로는 플래그에 관련된 값을 찾을 수 없었습니다.



이제 빼봅시다.



모든 hex값에서 10을 뺐을 때

 

fl[g iy ^ong\in iy yo \}z_ 


라는 문자열이 출력되었습니다.

뭔가 flag 관련된 문자열인듯 하여 이 값을 파보았습니다.



[는 a가 될 것이고, y는 s가 되는 것 같습니다.

그리고 원래의 hex값이 95일 때 _가 됩니다.(문제 힌트에 format is FLAG_IS_THIS_FLAG 와 같이 주어졌습니다.)

확인 해 본 결과, 3, 7, 9, 13, 18, 20, 23, 24, 25, 26번째 자리가 변환되어있었으며, 각각 -10 한 결과에서 +6이나 -6만큼 해줄 때 알파벳으로 출력이 되었습니다.

위 코드처럼 직접 인덱스를 박아줘도 되지만, +6, -6 한 결과가 알파벳의 범위에 있을 경우 출력하는 코드로 작성해도 무방합니다.



위 플래그 값을 대문자로 입력 해주면 됩니다.


FLAG_IS_DONGBIN_IS_SO_CUTE

[H3X0R CTF 2016]

Misc_1

mic_no_check



대회 초반에 공개 됐던 misc 1점짜리 문제입니다.



nc로 주어진 ip, port로 접속하면 echo : 라는 문구가 나옵니다. string 값을 입력 받는 것 같네요.



;sh를 입력해주면 shell이 떨어지게 됩니다.

id를 입력 해 보니 mic_no_check_solved 권한으로 로그인 되어 있는 것을 확인 할 수 있습니다.



아마 flag라는 이름으로 flag가 있을 것이니, 검색을 해 줍시다. 

find / -name flag 2>/dev/null 로 결과값만 빠르게 확인 할 수 있습니다.

Write Up을 쓰고 있는 현재, 서버 응답이 상당히 느리기 때문에 대회 당시에 찾았던 경로를 바로 사용하겠습니다.



해당 경로로 이동해 flag 값을 읽어주면 flag를 찾을 수 있습니다.


flag is RESPECT_CODEGATE





대회가 끝나서 하는 말이지만... vim은 터미널이 아니라 사용 할 수 없었지만 /tmp 경로에서


echo "#include<stdio.h>

int main(int argc, char *argv[]){

printf("Hello World!\n");

return 0;

}" > test.c


gcc -o test test.c


./test


위와 같은 형식으로 컴파일 및 파일 구동까지 모두 가능했었습니다. 물론 gdb와 파이썬도 돌아갔구요.

해당 id의 권한을 제한하지 않은 것이 큰 문제였던 것 같습니다.

+ Recent posts