Wargame.kr

Web_300

QR CODE PUZZLE



QR코드 관련 문제인 것 같습니다. 확인해보죠.



자바스크립트 퍼즐이라고 합니다.


접속 하니 QR코드가 우릴 반겨주네요. 퍼즐처럼 뒤섞여있습니다.

소스를 한번 확인해보죠.




저기가 수상해보이네요. 디코딩 해봅시다.



/img/qr.png라는 그림 파일을 불러오는 함수입니다.



접속 하니 퍼즐로 만들어지기 이전의 QR코드가 복원되었습니다.

스마트폰으로 스캔해서 접속 해 보면 FLAG를 얻을 수 있습니다.

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

[Wargame.kr] Web_500_DB is really GOOD  (0) 2016.05.17
[Wargame.kr] Web_450_login filtering  (0) 2016.05.17
[Wargame.kr] Web_450_WTF_CODE  (0) 2016.05.17
[Wargame.kr] Web_450_flee button  (0) 2016.05.16
[Wargame.kr] Web_200_already got  (0) 2016.05.16

Wargame.kr

Web_200

already got



Wargame.kr 첫 번째 문제입니다.


HTTP Response header를 볼 수 있는지에 대한 문제네요. 확인 해 봅시다.



우린 이미 키를 받았답니다.



받았네요.

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

[Wargame.kr] Web_500_DB is really GOOD  (0) 2016.05.17
[Wargame.kr] Web_450_login filtering  (0) 2016.05.17
[Wargame.kr] Web_450_WTF_CODE  (0) 2016.05.17
[Wargame.kr] Web_450_flee button  (0) 2016.05.16
[Wargame.kr] Web_300_QR CODE PUZZLE  (0) 2016.05.16

Webhacking.kr

Prob40



웹케얄 40번 문제입니다. 500점짜리 문제라 고생을 많이 한 것 같습니다.

일단 문제에 접속하면 위와 같은 로그인 폼이 나옵니다. no, id, pw 값에 1, guest, guest가 자동으로 입력되어있습니다.



그대로 로그인을 해주면 "Success - guest" 라는 메시지를 출력해줍니다.



만약 이 값들 중 하나라도 틀리게 된다면



이와 같은 "Failure" 메시지를 뱉어냅니다.



계속된 삽질 가운데, no 부분이 integer로 값을 받는다는 것을 알아냈습니다. 그래서 &&을 이용하여 select문을 사용해봤더니



정상적으로 로그인이 됩니다.

이를 이용하여 admin이 담겨있는 row로 추정되는 no=2에 해당하는 값을 빼오기 위해 아래와 같이 입력해줍니다.



위 쿼리는 no가 2일때 1을, 아닐 때 0을 출력해주는데, no=2가 admin이라고 가정하고 사용한 쿼리입니다.



로그인을 하면 admin의 패스워드를 요구하는 웹페이지가 나타납니다.



이제 admin의 패스워드를 알아내야하는데, 간단하게 "pw like %"와 같은 쿼리를 이용하여 패스워드를 찾아내도록 합시다.



python으로 pw 값을 찾아내는 스크립트를 작성하였습니다.



찾아낸 admin의 pw 값은 LUCK_ADMIN입니다.



애초에 mysql에서 대/소문자 구분이 없기 때문에 대문자로만 찾아냈습니다. 하지만 LUCK_ADMIN을 입력했을 때 Wrong!을 뱉어내기에 소문자로 luck_admin을 입력해주었습니다.



짠!




References

- THX to Zairo!!(http://zairo.tistory.com)

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

Webhacking.kr old-02(500)  (0) 2019.09.22
Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11

Webhacking.kr

Prob53


53번 문제입니다. 들어가자마자 hello wolrd로 우릴 반겨줍니다.

index.phps가 될 것 같으니 한번 들어가보죠.




소스를 보니 sql injection인 것 같습니다. 예전에 풀다 포기했던것까지 포함하면 2일 넘게 삽질을 했었는데... 후

결론부터 말하자면 함수를 모르면 풀 수 없는 문제입니다.

table name을 찾는 것이 목표인데 select와 from, union 모두 필터링이 걸려있어 information_schema에서 table_name을 추출 해 올 수가 없습니다. 여기서는 procedure analyse() 함수를 이용해서 table_name을 가져 올 수 있습니다.



소스에서 확인 한 대로 val 변수에 1을 집어넣어봅시다. test라는 값이 나오네요.



여기에 위에서 언급한 procedure analyse() 함수를 사용하면 db.table_name.value의 포맷으로 값이 나옵니다.

여기서는 db_name이 oldzombie, table_name이 Chal12NGe_53_TabLE_zz가 되겠습니다.


짠!




References

- THX to Zairo(http://zairo.tistory.com)

http://hyunmini.tistory.com/46

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

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11
Webhacking.kr prob59  (0) 2016.05.11

Webhacking.kr

Prob48



웹케얄 48번 문제입니다. 350점짜리 문제인데 풀고 나니 생각보다 쉬운 것 같습니다.

문제를 접속하면 위와 같은 화면이 나오는데, 파일 업로드를 할 수 있는 메모장을 구현 해 놓았습니다.

소스를 한번 확인 해 보겠습니다.



사실 처음 접근한 방법은 파일 업로드 취약점 또는 다운로드 취약점으로 생각하고 업로드 위주로 공격을 해 보았지만 실패하였고, filename으로 소스코드 자체를 바꿀 수 있기 때문에 시도해봤지만 파일 이름의 길이가 3자 이내로 제한되어 있어 실패하였습니다. 풀어본 결과, 이 문제는 파일 업/다운로드 취약점이 아니었습니다.

본론으로 돌아와서, 소스를 보고 알 수 있는 것은 현재 디렉토리에서 *.jpg 파일에 접근이 가능하다는 것입니다.



3.jpg는 초록색 슬라임 그림입니다. 글쓴이들의 프로필사진에도 있는 그림입니다. 귀엽네요.

1부터 모두 접근 해 본 결과, jpg파일은 1~8까지의 숫자로 이루어져 있었습니다.

하나하나 받기 귀찮으니 파이썬으로 코드를 짜서 실행해보죠.



wget으로 jpg 파일을 받는 코드를 작성해봅니다.



모두 받아주고



ls로 정보를 떠보니 유독 1.jpg만 파일의 크기가 크다는 것을 알 수 있습니다.

cat으로 파일을 읽어보니 아니나 다를까, php 코드가 숨어있었습니다.



아래 소스가 해당 코드입니다.



별다른 내용이 없는데, 21라인을 보면 zwitter_admin.php가 있는 것을 확인 할 수 있습니다.

수상하지 않나요? 질러봅시다.



짠!

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

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11
Webhacking.kr prob59  (0) 2016.05.11

Webhacking.kr

Prob60




60번 문제입니다. 들어가자마자 Access Denied를 뱉어내면서 우릴 밀어냅니다.

소스를 한번 확인해보도록 하죠.




PHPSESSID 값에 숫자가 들어있을 때 해당 문구를 뱉으면서 종료시키는 소스였네요.

그리고 아래 부분을 보면 세션id의 이름으로 파일을 하나 생성하는데, 내용 역시 세션id입니다.

그런데 접속하는 주소가 127.0.0.1일 경우 1초간 슬립 후 해당 파일을 삭제시킵니다.

중요한 점은 가운데 if문인데, mode 변수가 auth로 들어올 경우 해당 파일을 읽어 이름과 내용의 일치 여부 파악 후 일치할 경우 클리어 되는 부분입니다.

하지만 파일은 만들어지고 1초 뒤에 삭제가 되기 때문에 그 사이에 파일을 읽어줄 필요가 있습니다.

이 때 알아야 되는 개념이 레이스 컨디션입니다.

레이스 컨디션이란 말 그대로 경주, 경쟁자 상태를 말합니다. 서로 경쟁하는 사람들처럼 2개 이상의 프로그램이 동시에 돌아가며 서로 영향을 끼치는 상태를 의미합니다.

웹 해킹에서의 레이스 컨디션 뿐만 아니라 시스템 해킹에서도 사용되는 개념입니다.

그럼 차례대로 문제를 해결해보도록 하겠습니다.



크롬의 확장프로그램인 EditThisCookie를 이용하여 PHPSESSID를 변조시키겠습니다. 현재 PHPSESSID의 값에는 숫자가 포함되어있기 때문에 이를 없애줘야합니다.



숫자만 제거하고 영문은 그대로 놔두고 적용시키겠습니다.



세션에 해당하는 쿠키 값을 변조했기 때문에 이 바꾼 쿠키 값을 서버에 다시 저장해줄 필요가 있습니다. 다시 로그인 해 줍시다.



숫자를 제거한 세션ID로 로그인 되었습니다. Access Denied 메시지가 뜨지 않고 정상적으로 웹페이지에 접속 된 것을 확인 할 수 있습니다.



문제를 해결하기 위해 mode 변수를 auth로 GET요청을 통해 날려줍시다. 하지만 앞서 말했듯이, 1초 뒤에 파일은 삭제되기 때문에 레이스컨디션을 이용해 동시에 접속할 필요가 있습니다. 이를 위해 시크릿모드로 새 세션을 열어주었습니다.



새 세션에서도 위와 동일하게 쿠키 값을 바꾼 후 로그인 해줍니다. 그 후 두 윈도우에서 연속으로 refresh를 해주면 생성되는 파일을 read하면서 문제가 클리어됩니다.



이번 문제는 레이스컨디션에 대한 사전지식이 없을 경우 풀이하기 어려움이 있었던 문제입니다.

레이스컨디션에 대한 상세한 정보는 구글링을 통해 알아보시면 될 것 같습니다.

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

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr prob59  (0) 2016.05.11

Webhacking.kr

prob59





Webhacking.kr 59번 문제입니다.

딱 보니 sql injection을 위한 문제인 것 같습니다.

소스를 한번 확인해 보도록 하죠.



get이 아닌 post로 요청을 하네요.

id와 phone이 join에 필요한 파라미터, lid와 lphone이 로그인에 필요한 파라미터입니다.

만약 로그인 했을때 결과값의 lv이 admin일 때 클리어 할 수 있는 조건이 붙어있습니다.

join을 할 때는 여러가지 필터링이 걸려있는데, id와 phone 모두 admin이라는 단어를 필터링하고 sql injection을 위한 핵심 키워드들이 필터링 되어있습니다.

여기서 저는 id 부분에서 SQLi를 시도해보았지만 결국 모두 실패했습니다. Single Quotation으로 묶여있기 때문에 문자열 취급을 받아 정상적인 쿼리로 날아가는게 원인이었습니다. 이 문제에서는 id가 아닌 phone 부분을 공격 벡터로 이용하여 injection을 해야합니다.



위와 같이 쿼리를 작성했습니다. id에는 quotation이 먹히지 않기 때문에 단순히 참조하기 위한 수단으로만 사용합니다.

우리는 phone에서 reverse(id)를 이용해 admin을 입력해주기 위해 id의 값에 admin의 반대인 nimda를 입력해줍니다.

그리고 위와 같이 입력할 때 완성되는 쿼리문은 아래와 같습니다.


insert into c59 values('nimda',1,reverse(id)),(1,1,'guest');


(이 쿼리문은 insert문을 이용할때 insert into table values('A', 'A'),('B', 'B')와 같은 쿼리를 날려줄 때 한번에 여러 값을 동시에 넣을 수 있는 것을 이용한 쿼리문입니다.)

그렇다면 db에 들어갈 때는 reverse(id)에 의해 admin으로 변환되어 nimda/1 계정의 lv은 admin으로 들어갑니다.



로그인 해 봅시다.



짠!





-thx to Zairo(http://zairo.tistory.com)

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

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11

SuNiNaTaS

System Level2(Prob_24)




시스템 파트 2번째 문제입니다.

첫 번째 문제와는 달리 아무런 힌트도 주어지지 않은 상태에서 다운로드만 가능합니다.

다운로드명은 suninatas로, rwxrwxrwx권한이 주어져있지만 실행이 되지 않는 바이너리 형태였습니다.



혹시나 하는 마음에 .zip으로 확장자를 바꾼 후 압축 해제를 했더니 아니나 다를까, *.jar, *.apk를 압축해제 했을 때의 파일 구조를 보여주었습니다.

classes.dex 파일을 dex2jar 툴로 jar파일로 바꿔주도록 합시다.



classes-dex2jar.jar 파일을 jd-gui 툴을 이용하여 열어보았습니다.

해당 jar 파일 안에는 suninatas.class 파일이 존재했는데, 확인 해 보니 localObject1와 localObject2, paramAnonymousView 값에 각각 id, pw, key값을 받아내는 부분이 있었습니다. 그리고 정해진 key값이 들어오면 ~/chk_key.asp로 request요청을 날려주는데, id와 pw, key값을 모두 날려주는 것을 확인 할 수 있었습니다. 빨간 밑줄의 뒷 부분이 key값을 GET 형식으로 보내주는 부분입니다.



해당 url을 그대로 suninatas 웹페이지의 id, pw 그리고 class파일의 key값을 넣어 요청을 때렸더니 Wrong!Wrong!이라는 경고 메시지를 띄워줄 뿐 Auth Key를 뱉어주진 않았습니다.



그래서 직접 request를 때리지 않고 apk파일인만큼 직접 안드로이드에서 돌려보자는 생각을 해 보았습니다.



이클립스의 AVD 툴을 이용해 안드로이드 예뮬 환경 구축 후 직접 돌려보았습니다.



request 요청을 직접 때렸을 때와 달리 Auth Key값을 뱉어내는 것을 확인 할 수 있었습니다.

이번 문제는 가상 안드로이드 환경을 구축 할 수 있는지 없는지의 여부를 확인하는 문제였던 것 같습니다.

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level10(Prob_23)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

SuNiNaTaS

System Level1(Prob_16)




써니나타스 시스템 카테고리 첫 번째 문제입니다.

SuNiNaTaS.com에 속해있는 멤버의 패스워드를 알아내는 것이 우리의 목표입니다.

Download 버튼을 누르면 packet_dump.pcap 파일이 담겨있는 압축 파일이 받아집니다. 이 파일을 분석하여 패스워드를 알아내도록 하죠.



필터링은 http.request.full_uri contains "suninatas" 로 걸고 suninatas.com에 해당하는 패킷을 살펴보았습니다.

당연히 id/pw를 보내는 요청이기에 POST 요청만 확인하였으며, 맨 아래의 POST 패킷을 제외한 나머지 패킷에는 로그아웃을 한 흔적이 없었습니다.

따라서 맨 아래에 나와있는 id/pw가 실제로 로그인 되는 계정으로 추측 할 수 있습니다.

여기서 구해낸 ultrashark/=SharkPass01 로 suninatas 메인 페이지에서 로그인을 하면 아래와 같이 Key 값을 얻어낼 수 있습니다.



'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level2(Prob_24)  (0) 2016.05.10
SuNiNaTaS Web Level10(Prob_23)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

SuNiNaTaS

Web Level10(Prob_23)




써니나타스 웹 카테고리의 마지막 문제입니다.

Hard Blind SQL Injection 문제라고 합니다.

이번에는 admin이라는 단어 자체가 필터링이 되어 있습니다. 이를 우회하여 admin 계정의 패스워드를 알아내는 것이 우리의 목표가 되겠습니다.



기본으로 주어지는 계정인 guest/guest 계정을 이용하여 주물럭거리다 보니 위와 같은 형태로 문자열 필터링 우회가 가능하다는 것을 알아냈습니다.



그래서 22번 문제와 동일한 방법으로 admin 계정의 pw 길이를 먼저 알아냈습니다.



그런데 쿼리를 작성하다 보니 자꾸 No Hack. 필터링이 걸리기에 확인을 해봤더니 역시나 쿼리 길이 제한이 있었습니다.

우와 같이 30byte까지는 허용 범위이지만



30byte를 넘어가는 순간 No hack을 뱉어내고 종료시킵니다. 따라서 우리는 30byte 이내의 쿼리를 작성해야 하는 상황이 됩니다.



한참 고민하던 중 22번과 다르게 23번 문제는 or 이 필터링 되지 않았다는 것을 알고 바로 이용했습니다.

substring, substr이 필터링 되기 때문에 이를 우회하기 위해 left 함수와 right 함수를 함께 사용하여 기능을 구현했습니다.

또한 쿼리를 작성하다보니 계속 30byte를 넘겨서 고민을 계속 해본 결과 위와 같은 형태의 쿼리문이 완성되었습니다.



딱 30byte



바로 python으로 브포 코드를 작성하여 key값을 찾아냈습니다.



SuNiNaTaS web level all clear!

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level2(Prob_24)  (0) 2016.05.10
SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

+ Recent posts