안드로이드 7 버전 이상부터는 사용자의 인증서 신뢰 문제가 있어 시스템의 포멧에 맞게 인증서를 넣어줘야 정상적으로 인식을 한다.

우선 인증서 문제를 해결하기 위해 openssl을 설치한다.

http://slproweb.com/products/Win32OpenSSL.html

 

Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

Minimum system requirements: Windows XP or later 32MB RAM 200MHz CPU 30MB hard drive space Recommended system requirements: Windows XP or later 128MB RAM 500MHz CPU 300MB hard drive space March 14, 2023 - OpenSSL 3.1 is available. Also, Happy Pi Day. Users

slproweb.com

그 다음 Burp의 인증서를 DER format으로 추출해 준다.

그 후 저장된 디렉토리로 이동하여 아래 명령어를 수행해 준다. 저장 이름은 cacert.der로 해주었다 이름은 상관 없으나 확장자는 제대로 설정해줘야한다.

그 후 아래 명령어를 실행하여 pem 포멧 형식으로 저장한다. 그 후 파일 이름을 해쉬값으로 지정해야하는데 그것이 두번째 명령어 

인증서 변경
openssl x509 -inform DER -in cacert.der -out cacert.pem
인증서 해쉬값 추출
openssl x509 -inform PEM -subject_hash_old -in cacert.pem
해쉬값으로 파일명 변경
mv cacert.pem 9a5ba575.0

아래 빨간표시한 부분이 해쉬값이다 이를 cacert.pem 파일의 이름으로 설정하면 된다. 추가적으로 확장자도 .0형식으로 바꿔줘야한다.

이제 이 저장된 것을 넣어주기 위해서는 단말기 내  mount라는 작업이 필요하다. mount는 시스템에 읽기 쓰기 권한을 주는 것으로 시스템에 해당 인증서를 넣어주기 위해서 필요하다.

시스템 폴더에 쓰기 주기 방법 두 가지
1. adb remount
2 mount -o rw,remount /system
인증서 파일 집어넣기
adb push ./9a5ba575.0 /system/etc/security/cacerts/

이후 설정 >  보안 > 신뢰할 수 있는 자격증명 접속시 아래와 같이 PortSwigger가 잡히게 된다.

이제 넣은 인증서를 burp와 연동을 해야하는데 이를 위해서는 네트워크가 같이 연결되어 있어야한다. 와이파이의 경우는 공유기를 통해 전달되기 떄문에 컴퓨터가 같은 와이파이에 연결되어 있거나 공유기에 랜선 포트로 연결이 되어야한다.

 

cmd에 ipconfig 명령어를 쳐 현재 무슨 IP에 할당되어 있는지를 확인한다. 필자의 경우는 192.168.0.9 이다. 어차피 이 IP는 공유기에서 가상 IP로 할당해주는 것이라 실제 IP는 공유기에 저장되어 있어 블로그에 노출시길 수 있는 것이다.

여러분도 나와 같은 IP일 수 있다.

무튼 각설하고 돌아와 녹스에 네트워크 수정에 들어간다.

그 후 아래와 같이 설정한다. 

마지막으로 Burp에서 해당 아이피로 오는 데이터를 가져오기 위해 아래와 같이 세팅한다.

그러면 아래와 같이 패킷이 잡힐 것이다. 이제 진단을 시작하면 된다.

'APP 모의해킹 > Android' 카테고리의 다른 글

Activity 강제실행  (0) 2023.03.28
Snapshot  (0) 2023.03.23
[Android] 안드로이드 디컴파일 및 Smali 코드 분석  (0) 2023.03.09
[Android] 앱 추출 및 분석  (0) 2023.03.08
[Decompiler] APK Studio setting 방법 정리  (0) 2022.12.15

AndroidManifest.xml
➔구성요소를 정의하고 무슨 작업을 수행할 지 시스템에 알려주는 제어 파일
<manifest ... >
➔ package 명, Build 버전, API Level
<uses-permission>
➔ 앱에서 사용하는 권한
<activities>
➔ 앱의 동작 단위. 명시된 액티비티만 사용 가능
<intent-filter> - <activity> - <action “android.intent,action.MAIN”/>
➔ 앱이 실행될 때 가장 먼저 시작되는 activity 명시

안드로이드 Life Cycle

android:exported, android:sharedUserId 속성이 true 여부와 만약 true라면 protectionLevel이 Signature로 설정되지 않은 컴포넌트 존재여부 확인

android:debuggable : true ➔ 취약

안드로이드의 동작 방식에는 DVM(Dalvik VM) 방식과 ART(Android Runtime) 방식이 존재

 

NDK에서 취약한 함수
➔ BufferOverflow : strcpy, strcat, strncpy, memcpy, memset, scanf, strcat, spintf, strncat, gets, fgets
➔ FormatString : printf, sprintf, fprintf, snprintf, vfprintf, vsprintf, vsnprintf, syslog
➔ RaceCondition : tmpfile

 

DVM 이란 설치 속도는 빠르지만 실행속도가 느리다는 단점이 있다. 또한 많은 배터리와 메모리가 많이 사용된다.

ART 은 모든 파일이 컴파일 된 상태로 설치 시 깔리는데 설치 속도가 느리지만, 실행속도가 매우 빠르다는 장점이 있다.

현재는 늘어난 배터리와 메모리로 인해 ART를 주력으로 사용한다.

 

레지스터는 지역변수처럼 동작하고, 메소드들은 지역변수처럼 각자의 레지스터가 존재한다.

또한 가장 핵심은 호출된 메소드는 호출하는 메소드의 레지스터에 영향을 주지 않는다. 그 이유는 이미 함수를 호출할 때 메모리에 적재되어 있는 상태이기 떄문이다

 

 

https://source.android.com/docs/core/runtime/dalvik-bytecode?hl=ko 

 

Dalvik 바이트 코드  |  Android 오픈소스 프로젝트  |  Android Open Source Project

Dalvik 바이트 코드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 일반 디자인 머신 모델과 호출 규칙은 일반적인 실제 아키텍처와 C 스타일 호출 규칙을 거

source.android.com

 

Static : "this" 인수가 암묵적으로 첫번째 인수로 전달되지 않으면, Static메소드

Direct : overridde될 수 없으면 Direct메소드. vtable 개입 없이, 직접적으로 invoke 한다. 프라이빗 메소드, 생성자

Virtual : 자식 클래스들에 의해 overridde될 수 있으면 Virtual메소드. 클래스와 관련된 vtable을 사용해 invoke 한다

 

# 레지스터간 move :
move, move/from16, move-wide, move-wide/from16, move-object, move-object/from16
# 결과값을 얻거나 세팅:
move-result, move-result-wide, move-result-object, return-void, return,
return-wide, return-object
# 예외처리:
throw, move-exception
# 레지스터에 상수 대입:
const/4, const/16, const, const/high16, const-wide/1, const-wide/32,
const-wide, const-wide/high16, const-string, const-class
# 동기화:
monitor-enter, monitor-exit
# 타입체크:
check-cast, instance-of
# 배열 조작:
new-array, array-length, filled-new-array, filled-new-array/range,
fill-array-data
# 인스턴스생성:
new-instance
# 실행 조작:
goto, goto/16, packed-switch, sparse-switch,
if-eq, if-ne, if-lt, if-ge, if-gt, if-le, if-eqz, if-nez, if-ltz, if-gez, if-gtz,
if-lez
# 비교:
cmpl-float, cmpg-float, cmpl-double, cmpl-double, cmpg-double, cmp-long
# 멤버필드에 읽기/쓰기:
iget, iget-wide, iget-object, iget-boolean, iget-byte, iget-char, iget-short,
iput, iput-wide, iput-object, iput-boolean, iput-byte, iput-char, iput-short
#배열요소에 읽기/쓰기:
aget, aget-wide, aget-object, aget-boolean, aget-byte, aget-char, aget-short,
aput, aput-wide, aput-object, aput-boolean, aput-byte, aput-char, aput-short
# 메소드 호출:
invoke-virtual, invoke-super, invoke-direct, invoke-static, invoke-interface,
invoke-virtual/range, invoke-super/range, invoke-direct/range,
invoke-static/range, invoke-interface/range
# int, long, float, double 연산 명령:
add, sub, mul, div, rem, and, or, xor, shl, shr, ushr, neg-(int, long, float, double),
not-(int, long)
# ODEX 명령:
execute-inline, invoke-direct-empty, iget-quick, iget-wide-quick,
iget-object-quick,
iput-quick, iput-wide-quick, iput-object-quick, invoke-virtual-quick,
invoke-virtual-quick/range, invoke-super-quick, invoke-super-quick/range

 

 

 

참조 : https://i2sec.github.io/files/2017-10-20/study_dalvik_smali.pdf

추가 공부 자료 : https://strongslaves.tistory.com/29

'APP 모의해킹 > Android' 카테고리의 다른 글

Activity 강제실행  (0) 2023.03.28
Snapshot  (0) 2023.03.23
burp 인증서 안드로이드 with NOX  (0) 2023.03.22
[Android] 앱 추출 및 분석  (0) 2023.03.08
[Decompiler] APK Studio setting 방법 정리  (0) 2022.12.15

안드로이드의 경우 앱 추출을 adb 라는 툴을 이용해서 추출이 가능하다.

추출 명령어와 분석에 대해 이번에 알아보고자한다.

 

1. ADB Shell 에 접속하여 아래 명령어를 적는다.

만약 패키지가 많을 경우 내가 찾고자하는 앱의 영어이름으로 grep을 한다.

pm list package -f


//예시 만약 네이버 앱을 찾는다 하면 
pm list package -f | grep naver
//이런식으로 작성

그러면 과련던 데이터가 아래와 같이 나올 것이다. 이는 naver 어플에 관련된 내용이 들어있는 위치가 나올 것이다. 다만 안드로이드 버전에 따라 이렇게 검색이 안되는 경우가 있다 그 경우에는 하위 폴더까지 다 검색해서 찾아야한다.

APK 추출

adb pull /data/app/패키지명.apk test.apk

이는 shell에서 exit를 통해 종료 후 커맨드 창에서 쓰면 된다. Package명은 com~apk까지이다.

 

추출한 파일은 분석을 통해 재 개발 및 모의해킹에 이용될 수 있다. 다만 난독화가 되어 있는 경우 복호화 툴이 필요.

저번 세팅해 놓은 우분투 서버를 사용할려는데 에러가 발생했다.

 

첫번째 에러는 mount 문제로 하단 2개의 참고로 문제를 해결했다.

 

리눅스마다 사용하는 외장디스크 포멧형식이 다르고 uuid라는 마운트 지정 번호가 아닌 폴더명으로 마운트를 지정할 시 나중에 폴더명이 변경 시 에러가 발생할 수 있다.

 

필자의 경우는 서버 처음 로딩될때 마운트가 되지 않아 긴급 모드로 계속 들어가졌다.

 

https://www.manualfactory.net/10607

 

리눅스 / 하드디스크 파디션 만들기, 포맷하기, 마운트하기

리눅스에서 하드디스크 파티션 만들고, 포맷 하고, 마운트 하는 방법을 요약한다. 장착된 하드디스크 확인하기 ls 명령어로 컴퓨터에 장착된 하드디스크 정보를 출력할 수 있다. /dev/sda, /dev/sdb

www.manualfactory.net

https://m.blog.naver.com/kimmingul/220639741333

 

[Linux] 하드디스크 추가하는 방법

리눅스에서 하드디스크 추가하는 방법은 하드디스크 장착한 후 이를 mount 하는 것이다. (하드디스크를 컴...

blog.naver.com

 

두번째 문제는 로딩 시 네트워크 연결 문제로 부팅 시간이 오래걸리고 인터넷이 연결되지 않는 상황이 발생했다.

이 경우에 대해서 진짜 많이 뒤졌는데 허망하게도 eth1 네트워크실행이 되지 않아 인터넷 연결이 되지 않았다.

 

아래 글의 도움을 받았는데 아래 코드를 써보면 eth1가 실행되는지 안되는지 알 수 있다. 뒤에 eth0의 경우는 etho1 이 될 수 있고 사람마다 다르니 상황에 맞게 적어 사용하길 바란다.

 

서비스 확인
systemctl status sys-subsystem-net-devices-eth0.device

서비스 시작
systemctl start sys-subsystem-net-devices-eth0.device

그리고 아무리 해도 로딩시 아래 녀석이 시작되는 것을 막을 수는 없었다. 작동도 안되는 드라이버 접속 시도를 할려다 보니 오히려 서버 시작이 느려지는 현상이 생겼다. 이 부분에 대해서는 추후에 해결방안을 들고 오겠다.

sys-subsystem-net-devices-wlx909f330ee279.device 

 

systemctl list-units -all | grep subsystem

 

http://billauer.co.il/blog/2019/05/systemd-sys-subsystem-net-devices-eth0/

 

Solved: systemd boot waits 90 seconds on net-devices-eth0

Introduction After installing wireshark (and tons of packages it depends on) on a rather fresh and bare-boned Debian 8 (Jessie), I got the “A start job is running for sys-subsystem-net-devices-eth0.device” message for a minute and half on every boot. I

billauer.co.il

 

이번에 우분투 서버를 만들어 놓고 외부망에서 접속해서 시간 날 때마다 짬짬히 서버 설정을 하고 있다.

 

가장 중요한건 자신을 제외한 외부인이 접속을 하지 않도록 막아야한다는 것이다.

 

우선 방화벽 설정에 대해 알려주도록 하겠다.

 

ufw(Uncomplicated Firewall) 라는 방화벽이 있다

 

설치는 install로 하면 되고 port를 변경하기 위해서는 /etc/dafault/ufw 에 들어가서 port를 편집해 줘야한다.

apt-get install ufw

vi /etc/ssh/sshd_config

아래는 vi 편집기로 접근했을 때 설정하는 port이다 나는 22 포트로 되어 있지만 여러분은 22포트가 아닌 자기 원하는 포트로 하길 바란다. 왜냐하면 22포트는 기본 Default이기 때문에 해커들이 여러번 들려서 자동화 공격을 하여 패스워드를 뚫을려고 하기 때문이다.

 

필자의 경우에도 다른 포트를 사용했음에도 접속 시도한 로그가 남아 있었다.

1분도 안되는 시간동안 참 많은 패스워드로 시도한 것을 볼 수 있다.

22 포트는 사용하지말고 다른걸 사용하도록 하자 :)

 

각설하고 본론으로 넘어오면 22 포트로 변경했다고 치면 아래 명령어로 설정해 주면 된다

 

방화벽 실행
sudo ufw enable

방화벽 끄기
sudo ufw disable

방화벽 설정 가능한 포트와 현 상태
sudo ufw status verbose

22 포트 열기(tcp/udp 둘다 허용)
sudo ufw allow 22

22번 포트 열기(tcp만 허용)
sudo ufw allow 22/tcp

22번 포트 닫기
sudo ufw deny 22

22번 포트 설정에 삭제
ufw delete allow 22/tcp

만약 로그를 보고 싶다면 아래 명령어로 확인해 보면 될것이다.

성공한 접속 로그
last -f /var/log/wtmp

실패한 접속 로그
last -f /var/log/btmp

'서버 구축 > 우분투 설정' 카테고리의 다른 글

[우분투] 시작 에러  (0) 2023.01.09
우분투 서버 설정 시 apt 에러 정리  (0) 2022.12.21

+ Recent posts