실행해 보면 다음과 같이 첫 번째 패스워드 입력화면이 나온다.

패스워드 입력 후 비교구문을 보면 다음과같이 비교하는 패스워드 값이 보인다.

 

두번째 패스워드를 입력하게되면 다음과 같이 INT3에 걸려서 정상적인 흐름을 타지 못하므로 INT3 예외처리를 디버기 프로세스에서 처리할 수 있도록 Ollydbg 옵션을 지정해줬다.

 

그후 두번째 패스워드를 아무거나 입력하고 쭉 트레이싱하다보면 패스워드와 키값을 비교하는 루틴이 나온다. 내 입력값^2가 u1nnf2lg이면 된다.

계산해보면 다음과 같다.

 

Auth = r0b0RUlez!_w3lld0ne


'CTF > Writeup' 카테고리의 다른 글

Insomni'hack teaser 2018 VulnShop Write up  (0) 2018.01.23
Codegate 2017 RamG-thunder  (0) 2018.01.20
Sharif University CTF 2016 : SRM  (0) 2018.01.20
In CTF 2017 Challenge100 Write up  (0) 2018.01.20
Secuinside 2013 PE time Write up  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

실행해보면 다음과 같이 email과 Serial을 입력하면 된다.

ida로 열어서보면 입력한 Email이 정해진 형식에 맞는지 먼저 확인하고 시리얼넘버같은경우 하드코딩된 값이 저장되어 있다.

위의 코드를 보면 Email 형식같은 경우 일단 @ , . 이 존재해야하고 @다음글자와 .의 다음글자가 존재해야하는데 @의 다음글자와 같은경우는 .이 아니어야한다. 즉 @1.2 이런식으로 넣어주면 된다.
다음으로 Serial값은 총 16글자이며 하드코딩된 값이랑 비교한다.
Ollydbg로 어떤식으로 값을 비교하는지 확인해보면 순차적으로 맨앞부터 맨뒤를 번갈아가면서 지정된 값과 일치하는지 비교하는걸 확인할 수 있었고 바로 코드를 짜서 돌렸다.

 

잘나온당.


'CTF > Writeup' 카테고리의 다른 글

Codegate 2017 RamG-thunder  (0) 2018.01.20
Hack.lu CTF 2013: RoboAuth  (0) 2018.01.20
In CTF 2017 Challenge100 Write up  (0) 2018.01.20
Secuinside 2013 PE time Write up  (0) 2018.01.20
Hack.lu CTF 2015: Module Loader Write up  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

바이너리 파일을 실행해보면 입력값을 요구하고 아무거나 입력을 해보면 다음과 같이 뜬다.

ida로 간단히 전체적인 로직을 확인해보면 로직은 심플하다. 길이체크하는 함수를 통해 길이를 확인하고 assign이란 함수를 통해 내 입력값을 어떠한 형태로 할당한 후 두개의 함수를 호출한 결과값이 각각 15이면 플래그가 호출된다.

 길이를 체크하는 함수를 보면 다음과 같다. 입력값에 18을 곱한 값이 27의 배수이면서 27로 나누었을 때 값이 20이면 된다. 27*20은 540이고 이를 540/18하면 입력값 길이가 30글자인 것을 알 수 있다.

다음으로 입력값을 어떠한 형식으로 재할당 하는 함수를 확인해보면 다음과 같다. 전체적인 루틴은 첫번째 파라미터로 들어온 값의 주소의 1바이트의 값들을 두번째 , 세번째 파라미터로 들어온 값의 주소에다 1바이트씩 번갈아가면서 할당한다.

어떠한 값들이 실제로 파라미터로 들어가고 실제로 위와같이 할당이 되는지 확인하기 위해 Ollydbg로 실행한 후 확인해봤다.

첫 번째 파라미터로 내 입력값이 들어가는 것을 확인할 수 있고 2,3번째 파라미터로는 특정 메모리 지역의 주소값이 할당되는 것을 확인할 수 있었다.

실제 함수 내부로 가서 로직을 살펴보면 위와 같이 내가 입력한 값을 두번째 세번째 파라미터로 넘어온 메모리 주소값에 순차적으로 저장하고 있는 것을 확인할 수 있었다.

다음으로 입력값 할당이후 첫번째 함수의 내부를 보면 위와같이 먼저 메모리의 특정주소지역에 15바이트의 값을 저장해 놓는것을 확인할 수 있었다.

다음으로 위의 루틴이 첫번째 함수의 핵심 루틴인데 간단히 분석해보면 내가 입력한 값의 15글자(짝수번째 글자)를 한글자씩 각각 총 255번 0060FAD8주소부터 저장된 255개의 글자와 비교를 해서 일치하는 값일때의 횟수를 다시 0060F6D8주소에 더해 해당하는 주소에 저장된 값이 함수 진입시에 저장되었던 15글자와 일치하는지 확인한다. 각각의 글자가 모두 위의 2가지 조건에 일치하면 해당 함수가 리턴되었을때 특정메모리값에 15라는 값이 저장되게 된다.
그렇다면 위의 조건을 만족시키기 위해 0060F6D8 주소에 저장된 값들 중에 비교대상이되는 15글자의 값들의 1바이트씩 순차적으로 몇번째 위치에 속하는지 알아낸 후 해당 위치에 속하는 0060FAD8의 값을 짝수번째 값에 순차적으로 넣어주면 된다.



다음으로 두번째 함수를 보면 위와같이 처음 저장한 15글자의 값이 다르고 홀수번째 글자와 비교한다는 것만 다를뿐 전체로직은 같기 때문에 바로 코드를 짜서 돌렸다.


'CTF > Writeup' 카테고리의 다른 글

Hack.lu CTF 2013: RoboAuth  (0) 2018.01.20
Sharif University CTF 2016 : SRM  (0) 2018.01.20
Secuinside 2013 PE time Write up  (0) 2018.01.20
Hack.lu CTF 2015: Module Loader Write up  (0) 2018.01.20
Hack.lu CTF 2014: ImageUpload Write up  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

파일을 실행하면 캐릭터하나가 나온다.

ollydbg로 연 후 문자열을 확인해 보면 congratulation이란 성공 문자열이 보인다.

해당 문자열이 있는 곳으로 가보면 다음과 같이 C;@R 이란 문자열을 1 Byte씩 어떤 값과 비교 한 후에 성공문자열로 분기하는 걸 볼 수 있다.

C;@R란 문자열과 비교되는 문자열이 생성되는걸 루틴은 다음과 같다. EBP-84 주소에서부터 4byte값이 다음의 연산 과정을 거쳐서 C;@R값과 비교가 되는걸 볼 수 있다. EBP-84의 값에는 프로그램 자체에서 지정한 임의의 값이 들어가있고 그렇다면 어떠한 값을 넣었을때 아래의 연산과정을 거쳐서 C;@R가 생성되는지 역연산하는 코드를 짜서 돌리면 될 것 같다.

다음은 역연산하는 코드다.


auth = SECU


'CTF > Writeup' 카테고리의 다른 글

Sharif University CTF 2016 : SRM  (0) 2018.01.20
In CTF 2017 Challenge100 Write up  (0) 2018.01.20
Hack.lu CTF 2015: Module Loader Write up  (0) 2018.01.20
Hack.lu CTF 2014: ImageUpload Write up  (0) 2018.01.20
Hack.lu CTF 2014: Killy The Bit Write up  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

다음 url로 들어가면 문제 사이트가 나온다.
https://school.fluxfingers.net:1522/

date란 timer란 버튼이 있는데 눌러보면 module 파라미터 값에 담겨 전송되고 각각의 파라미터값에 따라 해당 모듈을 거쳐 응답이 온다.


여기서 date , timer에 해당하는 date.php , timer.php 를 include한 후에 각각의 로직을 거쳐 올거라 생각해서 lfi가 터질거라 생각했다. module=./date 이런식으로 넘겨도 정상적으로 응답이 왔고 여기서 lfi인걸 확신했는데 date랑 timer가 php 파일로 있을거라고 생각해서 뒤에 붙는 .php 우회를 해보려고 %00 넣어봤지만 php버전이 해당안되는 버전인지 우회가 안됬다. 여기서 일단 멘탈이 나갔는데 주석에
요런게 있었다. 

바로 디렉터리 들어가봤더니 디렉터리 리스팅이 됬고 date와 timer 파일이 있었다.

php파일이라고 생각했는데 그냥 확장자없는 파일이었다. ㅡㅡ 근데 막상 얘내 코드를 봐도 별게 없었고 lfi로 뭔갈 하긴해야되는데 현재내가 아는 파일이라곤 date , timer , index.php 요고 세개뿐이었다. 이걸가지고 뭘 할 수 있는게 없었고 여기서 한참 멘탈이 나갔다. 그러다 문득 애가 Apache 쓰고있던게 생각났고 .htaccess 파일에 뭔가있지 않을까 해서  ../.htaccess로 인클루드 해봤더니 디렉터리 하나가 딱 나왔다.

들어가봤더니 떡하니 flag 파일이 있었고 들어가보니까 flag가 나왔당.

 


블로그 이미지

JeonYoungSin

메모 기록용 공간

,

다음 url로 접속하면 문제 사이트가 나온다.
https://wildwildweb.fluxfingers.net:1421/

로그인 페이지와 업로드 기능하나가 있는데 로그인 페이지쪽은 SQLi나 이것저것 시도해봤는데 딱히 터지는게 없었다. 문제도 이미지 업로드인걸보니 업로드쪽에서 뭔가 터질 것 같았다. 일단 웹쉘은 못올리는 환경이었고 뭔수를 써도 jpg,jpeg 파일밖에 안올라가는 상황이었는데 이미지파일 올려놓고 보니 해당 이미지의 메타 데이터 값들이 같이 화면에 뿌려지고 있었다.

그렇다면 메타 데이터값들이 업로드 할 때 디비에 저장되고 이게 계속 뿌려지고있는걸로 보였다.

이미지에 만든 이 값에 you' 'ngsin 값을 넣었을 때 실제 디비에 저장되서 뿌려지고 mysql이면 youngsin으로 그대로 출력될 거라고 생각해서 해당 값 넣어놓고 업로드 해봤다.

예상대로  youngsin으로 출력됬다.

테이블 구하는 쿼리짜서 업로드했다.
youngsin',(select group_concat(table_name) from information_schema.tables where table_schema!='information_schema') ,1)#;

users 테이블에 보면 될 것 같다. 컬럼구하자.
youngsin',(select group_concat(column_name) from information_schema.columns where table_name='users') ,1)#;

맨 첫번째 데이터 출력 쿼리짜서 업로드해봤다.
youngsin',(select concat(id,'///',name,'///',password) from users limit 0,1) ,1)#;

계정이랑 패스워드 나온걸로 로그인해봤다.

잘나온당.


블로그 이미지

JeonYoungSin

메모 기록용 공간

,

해당 url로 들어가게 되면 문제 사이트가 나온다.
https://wildwildweb.fluxfingers.net:1424/

유저명 입력하는 곳이 보인다. 문제에서 소스코드를 제공해줘서 보니 일단 SQLi는 터지는게 보인다.

대충봤는데 처음엔 첫번째 쿼리 부분에 ' union select 'admin','dudtls8503@naver.com'# 이런식으로 쿼리 넣어주면 내 메일로 제너레이트 된 admin 패스워드가 데이터가 날라올거라 생각했다. 근데 아무리해도 안날라와서 github에서 문제제공 주의사항을 보니 실제 메일로 값을 보내지는 않는단다.
다른 관점으로 admin 패스워드를 그냥 뽑아야할 것 같은데 and or || &&가 다 필터링되고 있어서 blind로 데이터뽑기는 힘들어보였다. union으로 뽑으려고 보니까 첫번째 쿼리에서 데이터가 하나도 뽑히지 않은 상태에서 두번째 쿼리에서는 데이터가 뽑혀야하는 상황이었다. 첫번째쿼리에선 입력값이 = 로 처리되고 두번째 쿼리에선 sounds like로 처리되는데 여기서 뭔가 터질 것 같았다. sounds like라는 명령어를 첨봐서 좀 찾아봤더니 b'# 라고 쳤을때 첫번째 쿼리에선 b라는 네임이 없어서 패스되지만 두번째 쿼리에선 name sounds like 'b' 요렇게 들어갔을 때 다음과 같이 떴다.

이 차이를 이용해서 union이랑 limit 적절히 조합해서 쿼리하나를 짜봤다.
b' union select passwd,1 from user where name='Bo' limit 2,1#

Bo란 네임명에 패스워드가 출력됬당.

그럼 이제 admin 패스워드만 뽑으면 된다.

b' union select passwd,1 from user where name='admin' limit 2,1#

잘나온당.


블로그 이미지

JeonYoungSin

메모 기록용 공간

,

다음 url로 접속하면 문제 사이트가 나온다.
https://ctf.fluxfingers.net:1315/

로봇이 싫다면서 얘좀 없애게 돈좀 보내달란다.
입력 값을 보면 카드번호랑 돈 이메일 등 여러 입력 값이 보인다. 해당 값들에 SQLi가 터지나 이것저것 시도해봤지만 별다른 수확이 없었고 돈 보내주면 서포트 페이지를 알려준대서 대충 입력값 만들어서 보내면  다음과 같이 로봇때매 이메일 전송이 중단되서 서포트 페이지를 못알려준단다.

로봇 때매 못알려준다는거보니까 딱봐도 robots.txt가 관련된거 같아서 구글에다 해당 사이트 쳐서 로봇파일 뜨는데 있는지를 봤는데 별 수확이 없었다. 그래서 그냥 url에다가 robots.txt 파일 치고 들어갔더니 다음과 같이 disallow된  /vault라는 페이지 하나가 보인다.

해당 페이지로 들어가봤더니 인증화면 하나가 떠서 일단 대충 admin/admin치고 입력을 해봤다.

입력 후 버프로 잡아서 확인해보니 헤더값에 딱봐도 의심스러운 base64인코딩 된 값이 보인다.

해당 값을 디코딩해보니 내가 입력한 id , pw 값이 보인다.

딱봐도 SQLi 터질 것 같아서 admin' or 1=1--:admin 값 base64 인코딩해서 날려봤다.

admin으로 로그인되고 이미지 하나가 보인다. robotssuck 이라는데 처음엔 이게 키인가 했는데 내용 읽어보니 가장 최근 secret값을 구하란다. robotsssuck이 2번인거 보니 1번 구하면 될 것 같다.
admin' union select 'ab'||'c'--:admin 로 날렸을 때 먹히는거 보니 오라클인 것 같아서 테이블 뽑으려고 all_tables 썻더니 계속 에러가 났다. 뭐지하고 생각좀해보다 mysql, mssql , oracle , maria 제외하고 다른 디비 중에 뭘까하고 이것저것 대입해보니 sqlite 쿼리에서 테이블이 뽑혔다.
admin' union select sql from sqlite_master--:admin 인코딩 해서 날렸더니 다음과 같이 떳다.

hiddensecrets 테이블에 val값 중에서 가장 최근거 구하면 될 것 같다.
admin' union select val from hiddensecrets limit 1,1--:admin
admin' union select val from hiddensecrets limit 2,1--:admin
첫번째랑 두번째 행에 데이터가 들어있었고 두번째 행이 robotssuck 값이었다.
admin' union select val from hiddensecrets limit 1,1--:admin 인코딩해서 날린 후 뽑힌 값을 이미지형식으로 맞춰서 출력했다.

잘나온당.
eat_all_robots 란 이미지에 키 값이 담겨서 뜬다.
auth = eat_all_robots


'CTF > Writeup' 카테고리의 다른 글

Secuinside 2013 PE time Write up  (0) 2018.01.20
Hack.lu CTF 2015: Module Loader Write up  (0) 2018.01.20
Hack.lu CTF 2014: ImageUpload Write up  (0) 2018.01.20
Hack.lu CTF 2014: Killy The Bit Write up  (0) 2018.01.20
Hack.lu CTF 2013: Pay TV Write up  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

다음 URL에 들어가면 문제를 풀 수 있는 사이트가 나온다.
https://ctf.fluxfingers.net:1316/ 

대충 봤을때는 PASSWORD를 알아내 인증을 하면 될 것 같다.

코드를 보니 크게 눈에 띄는 건 없다. 그냥 보여지는 것 처럼 패스워드 값 넣으면 전송하는 로직이 끝이다. 일단 key값과 관련된 js 파일 하나가 보인다. 코드를 확인해봤다.

일반적인 json 전송코드인데 key값을 날릴 때 debug라는 파라미터가 주석처리되어 있는게 보인다.
확인해보자.

아무거나치고 날려보자.

js 파일에서 주석처리된 debug 파라미터 없이 전송되고 있다. 응답값을 보면 별다른 특징은 보이지 않는다.


debug 파라미터를 추가해서 넘겨봤더니 해당 요청을 처리해주는 start와 end값이 응답 값에 날아온다.

여기서 생각해볼 수 있는 건 키값을 요청받는 페이지에는 분명 정답 값을 가지고 있을 것이고 그걸 내가 보낸 key 값과 비교하게 될 것이다. 이 때 요청한 값이 정답인 경우와 아닌 경우에는 처리되는 로직이 다를 것이고 그렇다면 분명 정답값에 대해서는 가장 시간이 오래걸리거나 적게걸리게 될 거라고 생각했고 일단 알파벳과 숫자를 대상으로 한글자씩 날렸을 때 각 문자에 대한 시간차이가 어떻게 발생되는지 확인해보기 위해 코드를 짜서 돌려봤다. 

첫 번째 문자로 A가 입력됬을 때 눈에띄게 시간이 오래 걸린게 보인다. 여기서 서버가 요청한 키 값을 한글자씩 비교해서 정답인지 확인하는 로직이라고 생각했고 그럼 정답과 가까워질 수록 시간이 점점 오래 걸리게 될 거라고 생각했다. 이를 토대로 brute forcing 하는 코드를 짜서 돌려봤다. 

잘 나온당.
key = AXMNP93
auth = OH_THAT_ARTWORK!


블로그 이미지

JeonYoungSin

메모 기록용 공간

,