본문 바로가기

Computer Security/CTF

[CodeGate 2013] Vuln 200, exploit 대회때 서버환경이 뭔지 몰라서, 그냥 우분투 13.04에서 테스트했다. from socket import * from struct import * import time cmd = "id>&4\x00" send_plt = pack(' 더보기
[Secuinside 2013] 127.0.0.1, write up 공격 순서는, ssh key 덮어씌우기 -> 버퍼오버플로우 이다. 로컬에서만 접속할수 있는 데몬이기때문에, 로컬의 쉘이 필요하다.로컬 쉘을 얻을수 있는 방법으로는, ssh key를 서버에 올려놓으면, 비밀번호 없이 접근할 수 있다. $ ssh-keygen -t rsa로, public key와 private key를 만든후, private key 는 ~/.ssh/id_rsa 로 옮겨놓고,public_key는 이름을 authorized_keys로 바꾸고 ftp를 이용해 서버로 업로드한다. 그래서 ftp로 접속을 한다. (annonymous로 접속하면 된다.)그리고, active 모드로 변경한다. (서버는 대부분의 포트가 막혀있기때문에, passive 모드가 안먹힌다.)그리고, /home/secu_ftpd/a.. 더보기
[Secuinside 2013] PE time IDA로 열어본다. ... GetWindowTextA(::hWnd, &String, 128); SetWindowTextA(hWnd, &String); v16 = 5; do { String -= v16; String ^= 3u; --v16; } while ( v16 ); v17 = 4; do { v23 -= v17; v23 ^= 4u; --v17; } while ( v17 ); v18 = 3; do { v24 -= v18; v24 ^= 5u; --v18; } while ( v18 ); v19 = 2; do { v25 -= v19; v25 ^= 6u; --v19; } while ( v19 ); v20 = strcmp(&String, "C;@R"); if ( v20 ) v20 = -(v20 >> chr((((.. 더보기
[Secuinside 2013] Secure Web, write up 300점 치고는 너무 쉬운 문제였다. 그냥 php 쉘파일 업로드해서 확인하면 된다. 아래와 같은 파일을 업로드한다. ... 그 후에, ./uploads/[ip encoding]/파일이름로 접근하면 끝. 더보기
[Secuinside 2013] banking, write up 이번 문제의 핵심은 웹소켓을 이용한다는 점과, 그 후에는 간단한 블라인드 인젝션 문제이다. 웹소켓을 사용하기 위해선, 파이썬 웹소켓 모듈이 필요하다. 구글을 통해서 다운받는다. 그리고나면, desc와 asc를 넣어주는 부분이 있는데, 해당부분을 통해서 인젝션이 가능하다. 정렬을 할때, order by a desc, b asc로 하게되면, a로 정렬한후, a가 같을때 b로 정렬하게 된다.이 특징을 이용해서, by a desc, if(1=1,b,c) asc로 넣어주게 되면 블라인드 인젝션이 가능하다. 상황에 따라 True와 False가 의미하는 결과가 다르기때문에, 주의해야한다. from websocket import create_connection import json import pprint import.. 더보기
[Secuinside 2013] givemeshell, write up 파일디스크립터 문제이다. 쉘에서, $ ls > file 으로 할때, file에 명령어의 결과가 저장된다는것은 다들 알것이다. 사실 이건 $ ls 1>file 을 생략한 버전이다. 1번은 stdout을 의미한다. (쉘 화면에 출력되는것)그외에 0번은 stdin이고, 2번은 stderr 이다. 문제를 보면, 5글자까지 system으로 실행을 시켜준다.하지만, fork로 되어있기때문에, 출력 결과값이 우리에게 돌아오지는 않는다.우리의 소켓번호는 4번으로 일정하다. (fork이기 때문에) 그렇다면, ls>&4 를 치게되면, 그 결과값을 4번 디스크립터인, 연결되어있는 소켓에 쏴준다.그러면 그 결과가 클라이언트에게 날아가게 된다. 대충 느낌이 왔으니, 이제 쉘을 실행한다. 쉘은 원래 0번 디스크립트인 stdin을.. 더보기
[Secuinside 2013] Bigfile of secret, write up http 헤더중 range에 관한 문제이다. Range의 bytes=x-y로 범위를 조작해주면, 응답페이지중 x번째부터 y번째까지의 바이트만을 출력해준다. import httplib,urllib; conn = httplib.HTTPConnection("119.70.231.180",80) conn.connect() conn.putrequest('GET','/secret_memo.txt') conn.putheader('Connection','keep-alive') conn.putheader('Range','bytes=100000000-100005000') conn.endheaders() response = conn.getresponse() data = response.read() print data 더보기
[plaid CTF 2013] web 150 write up 이번 plaid CTF 에서 가장 만만했던 문제는 web 150 charseet 문제밖에 없었다. 나머지는 탈탈탈 털렸다. 특히 64비트 elf 문제들....... 그 문제들과는 반대로 web 150문제는 너무 쉬워서 거의 바로 풀었던것 같다. union sql injection 문제였는데, 취약점은 search를 하는부분에 있었다. 우선 로그인을 하고나서, search 부분에 들어간후, ' (따옴표) 를 삽입해보면 아래와 같은 에러가 뜬다. Failed to query database: SELECT c.id, c.cname, DATE_FORMAT(c.lastedited, '%d %M %Y @ %H:%i') as lastedited, c.owner, st.name as tname, ca.name as c.. 더보기
[Codegate 2013] Web 400 simple write up 이 문제는 if문과 rand를 이용한 문제 수학문제 4문제가 주어지고, 다 풀면 원래는 700점이 한계인데, 3000점을 넘어야한다. 처음엔 blind injection을 통해 숨겨진 문제를 찾는거라 생각했다.그래서 시간을 좀 많이 소모했다. 근데 블라인드 인젝션을 힘겹게 해서 데이터를 다 보고나니, 포인트가 있는 문제는 그 4개가 전부였다. 그렇다면, 방법은 1,2,3,4번 문제를 여러번 풀어야 한다는 소리인데.. 파라메터를 조작해서 인젝션을 하다보면, 정답에 + or 1 like 1 #만 붙이면 클리어가 뜨는걸 알수 있다. 첫번째 쿼리에서 이미 풀었는지 확인을 하고, 두번째 쿼리에서 문제의 포인트를 불러오고,세번째 쿼리에서 불러온 포인트를 이용해 업데이트 한다. 이렇게 추측했다. 그렇다면 첫번째 쿼리.. 더보기
[Codegate 2013] Binary 100 simple write up peid를 통해서, 혹은 그냥 프로그램을 바로 켜봐도 느낌상 C# 파일이라는것을 확인할수 있다. 그러므로, net reflector를 이용해서 디컴파일했다. 코드를 쭉 살펴보다보면, 우리에게 보여주는 중요한 string은 암호화 되어있고 xor과 AES encrypt로 되어있다는것을 알수있다. blocksize가 0x100이므로, Rijndael 방식중에서도 256비트라는것을 알수있고, key값은 9e2ea73295c7201c5ccd044477228527 이다. iv값도 key값과 같은 값을 사용한다. 그리고 중요한점은, utf-8방식으로 해야한다는것이다. 그래서 온라인상에 있는 rijndael decrypt 페이지에서는 안되더라.. 그래서 처음엔 python으로 진행하다가 나중에 php를 이용해서 디코.. 더보기