'Security' 카테고리의 글 목록 (2 Page) :: YPrefer's Develop&Security

점검한 앱중에 중요한 데이터를 단말에 저장하는 앱이 있었다.

개발자와 인터뷰를 통해 단말에 저장되는 데이터는 어떻게 관리가 되는지 물었더니 

특별한 방법을 사용해서 볼 수 없도록 만들었다 라는 자신감 넘치는 대답을 들었다.


링크 : https://www.eldos.com/solfs/

어떻게 했는지 코드를 분석하여 확인해보니 solfs라는 가상 스토리지를 사용하는 것으로 보여졌고,

이 스토리지를 이용하는데 필요한 패스워드는 하드코딩 되어있었다.


패스워드는 알고 있으니 보는 방법을 구글링 해봤는데, Solfs Explorer란 것이 있었고

이 프로그램을 구하기 위해 반나절을 족히 썻다.


결국 설치 파일을 구해서 설치하고 패스워드 넣으니

자신감 있었던게 무색하게 허무하게 데이터를 열람 할 수 있었다.

필자가 경험한 펌웨어 분석경험을 흐름대로 정리한 것이다.

어떤 제품인지는 보안상 적을 수 없지만, 이런 식으로 한다는 느낌적인 느낌을 남겨놓으려고 정리한다.


펌웨어 분석

<!--[if !supportLists]-->    <!--[endif]-->펌웨어 파일을 확인할 수 있는 도구 : Firmware mod kit, binwalk

펌웨어를 웹에서 다운받거나, Flash memory에서 덤프하는 방법으로 얻어낸다. 필자의 경우 점검이라 제공을 받았다.

Root:~#Binwalk –e rootfs2.2.0release를 하면 cramfs파일이 나오고,

cramfs 7zip으로 풀리기도 하고 mount-t type cramfs로 마운트하여 내용을 확인할 수 도 있다.

, firmware mode kit의 기능중에 uncram하는 기능이 있어 이를 통해 확인할 수 도 있다.

이렇게 나온 cramfs파일은 Root:~#file cramfs하면, Linux Compressed Rom File System data인인 것을 확인할 수 있다.

풀린 파일의 etc/shadow파일을 확인하면 hdd에 링크되어 있는 것을 확인할 수 있고,

Hdd를 풀기위해 타입을 확인해야 하는데 etc/fstab을 확인하면, 타입을 yaffs2타입인 것을 확인할 수 있다.

Hdd.2.8.2.release unyaffbinwalk로 풀면 shadow file의 내용을 확인할 수 있고, john the ripper를 이용해 root 의 패스워드를 얻을 수 있다.

<!--[if !supportLists]-->    <!--[endif]-->Nmap을 이용해 월 패드를 포트스캔하여 현재 서비스중인 포트들을 확인하고펌웨어의 바이너리 파일중 bind, listen, accept등 소켓통신시 사용되는 함수를 쓰는 바이너리 파일을 찾는다.

이 바이너리 파일들을 IDA를 이용해 리버싱 하여, 포트에 맞는 바이너리 파일을 찾아낸다.

그중 펌웨어 업데이트를 수행하는 바이너리를 찾아내고 업데이트 서버의 id/pwd를 알게 되면, 

telnet을 서비스하게 변조한 펌웨어로 업로드하는 명령을 내려, telnet을 서비스하도록 만들어 외부에서 접속이 가능하다.

 

 ARM환경구축

<!--[if !supportLists]-->    <!--[endif]-->구축에 사용한 도구 : QEMU, gdb, strace, ida

QEMU 에뮬레이터를 이용해 ARM OS를 올릴 수 있어 동적 디버깅을 시도해볼 수 있다.

https://people.debian.org/~aurel32/qemu/armel/ 에서 qemu를 다운받아 실행하고, proxy setting을 해주어 apt-get으로 update 

build-essential, gdb, strace를 설치한다.

qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4versatile -initrd initrd.img-3.20-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -redir tcp:2222::22

위와 같이 qemu를 실행하면 2222번 포트로 qemu ssh서비스를 붙을수 있어 scp로 파일전송이 용이하다.

<!--[if !supportLists]-->    <!--[endif]-->lsdaemon프로그램을 qemu로 옮기고, ldd를 이용해 ASLR이 적용된 OS라면

sysctl -w kernel.randomize_va_space=0를 적어 ASLR기능을 끄고, strace로 확인하면 관련라이브러리가 없음을 알수 있고, 관련라이브러리를 펌웨어에서 찾아 넣어주고 없는 파일을 touch로 빈파일을 만들어준다.

그러면 정상실행이 되지만 app_init에서 죽는 것을 확인할 수 있는데, 이것을 확인하기 위해, gdb로 따라가서 확인하면 daemon(0,0)에서 죽는 것을 알 수 있고 이 부분의 코드를 NOP으로 코드패치를 한다.

ld --verbose ./lsdaemon | grep SEGMENT_START 를 실행하면 baseaddress를 얻어낼 수 있다.

이를 통해 ida에서 edit->segment->rebaseprogram에서 baseaddress를 설정해주면,

실행 중인 주소와, ida의 주소값을 맞춰줄 수 있다.

이때 코드패치는 IDA hexview에서 F2를 누르고 apply를 해주면, 코드패치가 된다. 코드패치된 파일을 다시 넣어주고 실행하면 hostname을 불러오는 곳에서 죽고, hostname을 펌웨어의 것과 맞추어 주어 실행하고, strace로 에러를 제거해주는 방법을 반복해서 구축하여 동적디버깅을 실시한다

리버싱 자체는 불법이 아니지만 리버싱을 이용해서 타인을 기술과 소스등을

무단으로 도용하는 방법은 불법입니다.

악의적인 목적으로 사용하시면 안되며, 공부 목적으로 사용하시기 바랍니다.

 

링크 : http://www.sweetscape.com/010editor/

010editor라는 hexeditor가 있는데, 이 editor는 처음에 30일 동안은 trial로 사용할수 있도록 배포가 되어있다.

 

이 30일 제한을 우회하는 것을 해보도록 하자. 필자의 010 Editor는 v6.0.3버전이다.

010 editor를 다운받아 실행하면, 처음엔 물론 30일이 지나지 않았으니 정상적으로 실행이 된다.

여기에서 Tools > Register을 누르면 아래와 같이 등록 창이 뜨는데

이곳에서 이름과 Password를 입력해주어야 정식판으로 등록이 되게 되는 구조이다.



License 체크를 우회하기 위해서는

체크 로직을 찾아 분기문을 우회 해야 하는데 License를 잘못 입력 하였을때 나오는 스트링 값을 기준으로 체크로직을 찾아 보도록 하겠다.

 

아래를 보면 YPrefer 라는 문자열을 입력하였고,

잘못된 이름또는 패스워드 라면서 튕겨내는 것을 확인할 수 있다.

이를 통해 추측할 수 있는 것은, 어떠한 체크 로직을 통해서 나오는 출력

"Invalid name or password~~~~~~~" 라는 것을 알 수 있다.


위에서 알아낸 스트링 값을 어떤 코드블럭에서 참조하고 있는 지 알아내기 위해  IDA Pro라는 상용툴을 사용하기로 한다.

IDA PRo는 View ->SubView->Strings를 체크해주면 해당 바이너리 파일에서 사용하고 잇는 스트링 값을 모아서 보여주는 기능이 있어,

이를 통해 IDA Pro 를 통해 위에서 알아낸 스트링 값을 검색하여 본다.

 

 

검색된 스트링을 더블클릭으로 따라 들어가면, 아래와 같이 데이터 영역에 있는 것을 볼수 있고.

X버튼을 눌러 참보하고 있는 곳을 찾아볼수 있어, 다행히도 1개 밖에 없어 바로 체크로직의 위치를 찾을 수 있다.

 

 

아래와 같이 text영역에 스트링을 참조하고 있는 곳을 찾을 수 있다.

 

오른쪽 버튼을 눌러 Graph View 를 선택 하면 프로그램 흐름을 아래와 같이 그래프 형태로 볼수 있어 좀더 분석하기가 용이하다.


 

해당 스트링을 사용하는 분기로 오게 되는 화살표를 더블클릭하면 위 코트 블럭으로 따라갈수 있다.

그 부분에서 분기하여 Invalid name or password~~~ 를 출력하는 코드 블럭으로 가게 되는데,

JNZ는 zero flag의 값이 0이 아니면 분기 하는 어셈블리 코드인데 이를 JZ(0이라면 분기)

하는 코드로 패치 해주면 된다.

 

jnz를 jz로 코드패치

 

코드패치의 자세한 방법은

아래 링크를 확인하면 된다.

2016/11/28 - [Security/리버싱] - [바이너리 진단] 바이너리 코드패치 하는 방법.

 

코드패치를 통해 프로그램 흐름을 제어할수 있게 되었다면,

코드 분석으로 아래의 코드블럭을 목적지로 잡고 분기문을 보고 JNZ를 JZ로 코드 패치를 해주면서 따라간다.



그렇게 패치를 해주면!


 

 아래와 같은 문구가 뜨면서 인증이 된다.

근데 이 방법은 30일 지나서 password를 묻는 문구가 뜨면 저런식으로 아무 문자나 넣어도 accept 되는 방식으로 코드패치가 이루어져서,

매번 패스워드를 묻는 창이 뜨긴 하지만, 정상적 이용이 가능하다.

 

'Security > 리버싱' 카테고리의 다른 글

[바이너리 진단] 바이너리 코드패치 하는 방법.  (0) 2016.11.28

APK 를 분석하기 위해선, apktool로 까보고 소스를 분석하는게 제일 먼저가 된다.

그래서 이 소스를 보기 어렵게 하는 난독화 기술이 있는데 보통 개발 전 단계에서 android에서는 Proguard와 dexguard를 사용하는 것으로 알고있다.

Proguard는 무료고 dexguard는 상용인데 이것들도 까보면 물론 매우 엄청 분석하기 짜증나고 힘들지만

어느정도는 따라가 볼 수 있다.

 

근데 최근에 만나게 된 Dexprotector란 녀석은 상용이긴 한데 class조차 보이지 않았다.

보이는건 ProtectedMainApplication 딱 하나.

 

처음 접했을때 무지 황당하더라..

소스 분석은 아예 접고 다른 부분을 보긴 했지만, 아직도 이게 적용된게 다시 나온다면 어떻게 해야 할지 모르겠다.

 

알아보니 개발 후 단계에서 사용하는 난독화 Tool 이라고 하는데, 가격이 좀 비싸다.

이것과 같은 단계에서 사용하는것이 Medusah와 APK Protect란 것도 있다고 한다.

링크 : http://medusah.com/ https://sourceforge.net/projects/apkprotect/

 

혹시 Web 변두리 어디엔가 있는 이 블로그에 방문해서 이 포스트를 보는 누군가가

관련정보를 공유해주시면 정말 블로그를 시작하기에 잘했다는 생각이 들거 같다.

점검을 하다보면, Hmac 기술이 적용된 어플리케이션을 볼 수 있다.

Hmac이란 Hash-based Message Authentication Code 의 약자인데, 사용자가 값을 변조했는지 아닌지 알아차리기 위한 기술이다.

이 기술은 서버에 요청할때의 값을 정상적일때 Hash 값과 함께 보내서 변조를 막기 위함인데,

물론 완벽하게 막지는 못하지만 최소한 공격자를 귀찮게 만들 수 있다.

 

사례를 들어 설명 하자면, 전에 점검 했던 Web 중에 한 사이트가 Hmac 기술을 적용하고 있었는데

사이트 URL을 공개하기는 좀 그러니까

이 사이트에서 요청하는 값이 http://www.yprefer.com 이고, post로 value=aaa 란 값을 전송하는게 정상적이라고 가정하자.

 

이때 이곳에서는 로그인 할때 Chip 값을 사용자에게 주고, 이 Chip 값과 url 그리고 aaa라는 Value 값을 섞어

HASH값을 만들어내어 HTTP Header로 같이 Request를 보냈었다.

 

그러면 공격자가 Proxy Tool을 이용해 aaa라는 값을 bbb로 변조 하였을 때,

서버에서는 동일한 HASH알고리즘을 사용해서 CHip 값, url, bbb를 섞어 HASH값을 만들어내고, 사용자가 보내온 Header의 HASH값과 비교하여

맞는 요청인지 아닌지 확인하는 방식으로 변조를 막았었다.

 

물론, 여기에서 HASH 값을 만들어내는 로직은 사용자의 javascript에 있기때문에, script를 분석하면 HASH값을 만들어 낼수 있고,

변조된 bbb의 값을 가지고 HASH를 만들어 데이터와 HASH값을 동시에 변조하면 막을 수 없는 맹점이 있긴 하지만

 

분명 공격자에게 script를 분석해야 하는 귀찮음과 요청시 hash값을 계산해야 하는 번거로움을 안겨줄 수 있는 방법임은 틀림없다.

 


Android APK 진단을 위한 툴 소개

 

네트워크 통신을 하는 앱이라면, 웹 진단 툴을 함께 사용한다.

Apktool

링크 : http://ibotpeaches.github.io/Apktool/

ApkTool은 apk파일은 디컴파일하거나 수정한 후 다시 컴파일 할 수 있는 Tool .

여러 옵션이 있지만 자주 사용하는 옵션은

 d 옵션 : decompile 해주는 옵션으로 smali 파일이 아웃풋

b 옵션 : recompile 해주는 옵션으로 apkfile이 아웃풋으로 나오며, signing을 거쳐 안드로이드폰에 설치가 가능.

d -d 옵션 : decompile 해주는 옵션으로 smali 파일이 아웃풋으로 나오지만, 확장자를 java파일로 만들어주어 동적디버깅 할 때 사용.



apk-sign

링크 : https://github.com/appium/sign

안드로이드에는 signing되지 않은 앱은 설치되지 않음

이 signing은 개발자가 APK파일로 만들어 낼 때 하는데, Apk Tool 을 이용해 decompile을 하면 signing이 풀림.

따라서 폰에 설치를 하기 위해서는 signing을 해주어야 하는데, 원 개발자의 서명을 따라할수는 없으나 아무 keystore를 가지고 signing만 해주어도 설치는 가능.



dex2jar

링크 : https://sourceforge.net/projects/dex2jar/

Apk파일은 안에 classes.dex라는 파일이 있는데 이 파일은 Android Dalvik이 인식할수 있도록 class파일을 바이트 코드로 변환한 파일.

이 파일을 dex2jar를 이용해 class파일을 추출하는 Tool.


jd-gui

링크 : http://jd.benow.ca/

JAVA decompiler 

위 dex2jar를 이용해 추출해낸 class파일을 java로 복원해주는 Tool.

그런데 복원할때 완벽하지 않아 복원이 잘 되지 않는 부분이 있는 것이 아쉬운점.


jadx

링크 : https://github.com/skylot/jadx

JAVA decompiler

필자는 dex2jar&jd-gui 보다 jadx를 사용하는 것을 더 선호하는데 jadx의 결과가 jd-gui보다 좀더 정확하게 복원을 해주는 것으로 느껴지고, 또 dex2jar라는 단계를 밟지 않고 바로 apk파일을 끌어다 놓는 것만으로 디 컴파일이 되기 때문.

 

cheatengine

링크 : http://www.cheatengine.org/

메모리 변조 툴

android 앱에 attach해서 메모리를 변조등을 수행할 수 있다.

 

frida

링크 : http://www.frida.re/docs/android/

frida는 javascript inject를 이용해 개발자가 만들어낸 함수를 공격자가 명시해서 호출하거나, 함수를 새로 만들어서 호출 할 수도 있다.

예를 들면 Getpassword(String id) 이런 함수가 있다면 공격자가 이를 호출하여 password를 얻어낼 수 도 있다.


ida pro

링크 : https://www.hex-rays.com/products/ida/

ida는 동적 디버깅 툴로 대상 Apk를 실행시키면서, 각 부분에 BP를 걸어 그 시점에서의 레지스트리 값등을 확인하고, 패치를 통해

체크로직등의 우회를 노릴수 있다.


drozer

링크 : https://labs.mwrinfosecurity.com/tools/drozer/

안드로이드 진단 프레임워크로 안드로이드 어플리케이션의 보안 취약점을 진단할 수 있다.

 

introspy

링크 : https://github.com/iSECPartners/Introspy-Android

함수 호출을 포함한 어플리케이션 API 안드로이드 API 파라미터와 리턴값을 로깅 해주는 tool이다.

+ Recent posts