Category Archives: 보안

WinDivert – Windows Packet Divert

사실은 이거 우회하는거 프로그램으로 만드려다 알게된 드라이버

윈도 방화벽은 단순히 포트나 어플리케이션 단위로만 컨트롤이 되서 TCP Flags 기준으로 필터링하지 못한다.
원 드라이버 홈페이지 https://reqrypt.org/windivert.html
여기는 파이썬으로 래핑해놨다.

pip로 바로 설치가능

간단하게 작성한 rst 제거 스크립트

WinDivert를 이용하면 뭔가 나중에 재밌는걸 만들어 볼 수 있을것 같다.

warning.or.kr season 2

엊그제부터 인터넷 도감청이 이슈다.
이전에는 HTTP프로토콜의 HOST 헤더를 확인함을 분석하여 HTTPS를 사용하는경우 우회가 가능하였다. (이전분석)

이번에는 HTTPS를 사용하더라도 접속이 안되는것을 확인, 분석하였다.

유명한 성인사이트 접속시 HTTPS 접속임에도 ERR_CONNECTION_RESET에러가 뜨며 접속이 거부되었다.

Wireshark 패킷을 확인해보니

Client Hello 이후 RST, ACK패킷이 확인된다.
중요한점은 RST 패킷 이후에도 Server Hello가 확인된다.
이는 서버에서 정상적으로 응답하나 중간에 어떤xx가 RST패킷을 보내는것으로 추정된다.
TCP Reset Attack 의 일종이다.

RST패킷을 보내는 기준으로는 TLS패킷의 Server Name Indication extension (SNI)로 보여진다.

GDNS를 통해 원본의 IP주소를 확인하고 /etc/hosts파일을 수정하여 test.com으로 접속시 대상의 서버로 접속하게 만들어 보았다.
이후 https://test.com 접속시 다음과 같은 패킷을 확인할 수 있다.


목적지로부터 정상적인 응답이다.

하지만 서버는 301 Moved Permanently 응답을 보내며 원본의 도메인으로 Redirect 시켜버리며 다시 Client Hello는 reset 되어버린다.

서버는 정상적으로 응답하는것을 재차 확인하였고
중간에 날라오는 RST, ACK를 잘 처리하면 (iptables -I INPUT -p tcp –tcp-flags ALL RST,ACK -j REJECT –reject-with tcp-reset)

우회하여 접속할 수 있다.

Android analysis

disable DM-Verity

mod fstab file in initrd of boot.bin
delete "verify" option in mount option field

set SELinux permissive

add below to kernel cmdline
enforcing=0 androidboot.selinux=permissive

useful adb command

Get Activity List
dumpsys package | grep -i [app_id] | grep Activity

Run Activity
am start -a android.intent.action.MAIN -n [app_id]/.activities.xxxx [-e extra_id extra_value]

extract bootimg
abootimg -x boot.bin

modding kernel ramfs
to extract
cat initrd | gunzip | cpio -vid
to merge
find ./ | sort | cpio -o -H newc | gzip -9 > ../new_initrd
make bootimg
abootimg –create new_boot_su.bin -f bootimg.cfg -k zImage -r new_initrd -s stage2.img

restart zygote
killall zygote ## 가끔 잘안됨
setprop ctl.restart zygote

 

Start adbd via commandline

setprop service.adb.tcp.port 5555
settings put global development_settings_enabled 1
settings put global adb_enabled 1
start adbd

adb push adbkey.pub /data/misc/adb/adb_keys

https://stackoverflow.com/questions/26213954/how-to-solve-adb-device-unauthorized-in-android-adb-host-device

useful tools

jadx
JEB

samsung 970 evo 에 TCG OPAL로 HW Encryption 적용하기

보통 파일이나 드라이브를 암호화 하기위해서는 소프트웨어에서 암호화를 진행하거나 CPU의 힘을 빌려 암호화를 진행한다.
이경우 암복호화 작업에 CPU연산이 소모되며 키관리도 OS에서 하다보니 여러가지 문제점이 생긴다.
SED(self-encrypting drives)의 경우 디바이스 자체적으로 암복호화하여 스토리지에 저장하는 방식을 지원한다.
당연 CPU연산이 불필요한 만큼 속도와 보안적인 측면에서 이점이 있다.

최근 구매한 970 EVO는 Class 0, TCG OPAL, Encrypted Drive  세가지 하드웨어 암호 옵션을 제공한다.
Class 0은 BIOS의 지원하에 부팅과정에서 암호를 입력하면 드라이브가 잠기거나 풀린다.
TCG OPAL과 Encrypted Drive의 경우 부팅 이후 특정 명령어를 컨트롤러로 보내 드라이브를 잠그거나 해제할 수 있다.

가장 간단한건 BIOS에서 지원하는 Class 0 방법을 사용하는것이다.
하지만 최근 구매한 Lenovo E585의 경우 영문자 + 숫자 조합만 가능하며 특수문자는 지원하지 않는 문제가 있다.
패스워드에 특수문자가 들어가지 않는다면 패스워드 크랙에 소요되는 시간을 크게 줄일 수 있고 그만큼 보안에 취약해진다.
따라서 현재 BIOS 상태에서는 Class 0는 선호하는 방법이 될 수 없다.
Encrypted Drive는 윈도우를 사용하는경우 여기에서 활성화 방법을 다루고 있다. (Microsoft eDrive 와 같은건가?)
이글에서는 TCG OPAL을 사용하여 SED를 활성화 하는 방법을 설명하고자 한다.

TCG OPAL을 설정하기 이전 간단한 구조부터 알고가면 이해가 쉬워진다.
OPAL이 활성화 된 Drive는 다음과 같은 동작을 한다.
처음 전원 투입으로 PC가 부팅하면서 Drive를 액세스 하면 Drive는 지정된 이미지(PBA:Pre-boot authrization)를 보여준다.
PBA는 부팅 가능한 작은 리눅스 이미지 이며 부팅과 함께 패스워드를 입력받아 이 패스워드를 Drive로 전달하는 역할을 한다.
Drive에서는 입력된 패스워드가 일치하면 Drive를 Unlock하게되며 이때부터는 암호화된 데이터를 읽고 쓸 수 있게된다.
PBA가 보여지는동안 즉, 패스워드가 입력이 안된 경우(실패한경우) 다른 매체를 통해 부팅하게되면 이 드라이브는 사용할 수 없다.

PBA가 보여지는동안 리눅스에서 Gparted로 확인하면
이렇게 보이지만 unallocated 영역을 파티셔닝하게되면
이런 에러가 뜨게된다.
윈도우에서 해당영역에 접근하면 이렇게 뜨게된다.
한마디로 읽지도 쓰지도 못한다.

서론이 길었지만 본론으로 돌아가서 TCG OPAL을 활성화 하는 방법은 libata.allow_tpm를 활성화 하여 sedutil을 사용하는 방법과 부팅가능한 USB에 rescue system을 구워서 그걸로 부팅해서 sedutil을 사용하는 방법이 있다.
본인의 경우 현재 시스템에 아무런 OS가 없어 Bootable USB를 사용하여 진행하였다.

USB를 통해 부팅하는경우 다음과 같은 로그인 화면이 나타난다.
나타난대로 login id는 root이며 패스워드는 없다.
사용가능한 Drive를 확인하기 위해 "sedutil-cli –scan" 명령을 입력하면 다음과 같은 결과가 나타난다.
이때 /dev/nvme0 뒤에 나타나는 숫자 2는 TCG OPAL 2.0을 지원한다는 의미이다.
이후 명령부터는 Drive를 초기화 할 수 있으니 데이터는 반드시 백업하여야 한다.
"linuxpba"명령은 앞서 말한 패스워드를 입력받아 Drive를 활성화 하는 명령이다.
패스워드로 "debug"를 입력하면 현재 설정만 보여주고 재부팅 하지 않는다.(다른거 입력하면 재부팅한다;)
현재는 설정이 아무것도 되어있지 않다.
"linuxpba" 명령을 통해 Drive가 보이며 해당 드라이브가 "is OPAL NOT LOCKED" 상태이면 잠글 수 있는 상태이다.
(본인의경우 linuxpba명령을 썼을때 디버그 메시지가 출력되어  less 나 more 명령어로 stdout만 따로 보았다)
예제에서 패스워드는 debug로 설정한 뒤 마지막 단계에서 원하는 패스워드로 바꾸게 된다.
진짜 이후 명령어부터는 기존 데이터가 어떻게 될지 모르니까 반드시 백업하고 진행하여야 한다.
Drive 잠금을 설정하기 위해 다음의 명령어를 입력한다.
sedutil-cli –initialsetup debug /dev/nvme0 # 초기화
sedutil-cli –enablelockingrange 0 debug /dev/nvme0 # 락0활성화
sedutil-cli –setlockingrange 0 lk debug /dev/nvme0 # 락0 크기 설정
sedutil-cli –setmbrdone off debug /dev/nvme0 # MBR done 설정, pba image 설정하기위한 명령어인듯
gunzip /usr/sedutil/UEFI64-n.nn.img.gz # 압축해제
sedutil-cli –loadpbaimage debug /usr/sedutil/UEFI64-n.nn.img /dev/nvme0 #pba image설정
n.nn은 해당하는 rescue 이미지의 버전마다 달라진다. 본인의 경우 UEFI64-1.5.1.img를 사용하였다.
순서대로 차례대로 입력하면 다음과 같은 결과가 나타난다.
여기까지 했다면 "linuxpba" 명령을 내리면 대상 Drive는 "is OPAL Unlocked" 상태로 표시되게 된다.
"not locked"와 "unlocked" 모두 한글로 보면 잠겨있지 않음이지만, not locked의 경우 잠금이 설정이 되지않은 상태, unlocked는 잠금이 설정되었지만 풀려있는 상태로 "is OPAL Unlocked" 상태가 되면 잠금이 설정되어 있는상태이다.
설정된 패스워드는 debug 이며 패스워드 변경을 위해 다음의 명령어를 입력한다. 이때 yourrealpassword의 경우 실제 적용될 패스워드로 변경하면 된다. (쉘에 직접 입력하는 방식이다보니 백슬러시를 통한 문자열 이스케이프가 필요하다)
sedutil-cli –setsidpassword debug yourrealpassword /dev/nvme0
sedutil-cli –setadmin1pwd debug yourrealpassword /dev/nvme0
패스워드 변경명령은 아무것도 출력되지 않는다. (성공메시지 조차도….)
패스워드 변경이 정상적으로 되었는지 확인하기위해 다음의 명령어를 실행하면
sedutil-cli –setmbrdone on yourrealpassword /dev/nvme0
변경된 패스워드가 맞을경우 MBRDone set on 이라고 뜨게 된다. (틀릴경우 method status code NOT_AUTHORIZED)
확인까지 끝났으면  전원을 "완전히" 껐다가 설정된 Drive로 부팅하게되면  PBA가 뜨게 된다.
설정한 패스워드를 정확히 입력하면 "is OPAL Unlocked" 가 뜨며 자동적으로 재부팅하게된다 (여기서도 debug를 입력하면 쉘로 빠지며 sedutil을 사용할 수 있다)
재부팅할때 BIOS에서 다른 부팅매체를 선택해 Windows 나 Linux 등의 OS를 설치할 수 있다.
아래는 샘숭의 매지션 소프트웨어에서 확인결과.

TCG OPAL 단점
부팅을 두번한다. (느리다 빠른부팅이 되지않는다.)
설정이 생각보다 간단하지 않다.(Class 0만큼 쉽지않아..)
절전모드(S3)에 들어가면 깨어나질 못한다. (드라이브 전원차단 = 인증해제, 다시 인증할 방법이 커널에 구현되어 있지 않음 sedutil에 –prepareForS3Sleep 과 같은 명령어를 쓰면 된다고하나 난 아직 잘안됨… 해결방법 아시면 피드백 부탁드립니다)
설정은 했는데 오버프로비저닝이 잘 적용 되는지 모르겠다.

ps. 패스워드 까먹으면 어떻게해야할지 모른다. (초기화로 되려나? 서비스센터 가져가야되나? 이미 OS 설치해버려서 테스트하기 귀찮…)
몇일전 Self-encrypting deception: weaknesses in the encryption of solid state drives (SSDs)  이런 논문이 나왔다.
라고한다.

참고문헌
https://wiki.archlinux.org/index.php/Self-Encrypting_Drives
https://github.com/Drive-Trust-Alliance/sedutil/wiki/Encrypting-your-drive

 

 

++++ 20181206 +++ 추가 +++

디스크 매니저에서는 잘 보이나

매지션 소프트웨어에서는 안보임…
시간날때 삼성에 문의해봐야지

비밀번호를 생년월일로 사용한 보안메일

몇일전 나의 메일주소로 X통신사의 이메일 청구서가 날라왔다.
내용은 보안메일이라고 사용자의 생년월일을 입력하라고 요구하였다.
수신한 메일은 나의 청구서가 아니며 비밀번호에 해당하는 생년월일도 모르는 상황이다.
잠깐 생각해보니 사람이 100년 산다고 생각하고 1년은 365일이라는걸 가정했을때 간단하게 36500의 경우의 수를 얻을 수 있었다.
또한 미성년의 경우는 제외하고 가장 가까운 날짜부터 차례로 계산한다고 하면 3만이 되지않는 경우의 수가 나온다.
직접 손으로 입력하기에는 많은데 JavaScript를 이용하여 패스워드에 해당하는 문자열을 생성하고 이를 Decrypt에 직접 대입하며 성공할때까지 수행하도록 만들 수 있다.

생각보다 빠르진 않았지만 결과는 스크립트를 실행한지 30분이 되지않아 출력되었다.

획득한 비밀번호를 이용하여 보안(?) 메일을 열어볼 수 있었다.

VVIP고객님께서 갤럭시 J5로 바꾸면서 이메일 주소를 잘못입력한것으로 확인된다.
(수신거부가 없다..)

생년월일은 절대로 비밀번호로 사용하지 않도록 해야 한다.
(근데 내가 받아보는 카드 청구서도 비밀번호는 생년월일이었다…..)