메뉴 닫기

SNI 차단 우회하기 (for 32bit 브라우져)

시작하기 앞서,, 본 게시글에 이야기 하는 프로그램은 이경문 교수님께서 공개하신 영상SSL에대해 설명한 한 Cisco의 게시물을 바탕으로 작성되었습니다.

(해당 자료들의 제작자 분들,,, 감사합니다,,)

뭐 암튼, 해당 영상을 보면 Client Hello패킷을 쪼개서 보냄으로서, 통신사에서 하는 SNI체크를 우회할 수 있음을 알 수 있습니다.

그래서,, WSASend를 후킹해서 Client Hello패킷만 처음16바이트와 나머지 바이트들을 쪼개서 보내는 프로그램을 작성했습니다.

아마(?) 모든 32비트 브라우져에서 동작 하겠지만 일단 DLL을 인젝션해주는 프로그램은 IE를 타겟으로 잡고 만들었습니다.

 

아 물런 32비트용으로 작성했기때문에,, 64비트 브라우져에서는 안통합니다. (다음주쯤에 시간나면 이것도 만들 예정)

 

Download : ie_hook(Release_2.1).7z (19.2.12 PM 6시 수정)

 

p.s DLL 핵심부분 코드 (나머지 코드는 그냥 WSASend주소 얻어와서 핫패치 적용하는겁니다, 길어서 생략)

 

int WINAPI hook_WSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
	DWORD CutLen = 16;

	sockaddr_in peeraddr;
	int size = sizeof(peeraddr);
	getpeername(s, (struct sockaddr *)&peeraddr, &size);

	if (htons(peeraddr.sin_port) == 443) {
		BYTE *buf = (BYTE *)(lpBuffers->buf);
		DWORD org_Len = lpBuffers->len;
		PCHAR org_buf = lpBuffers->buf;

		/*
		Handshake (22, 0x16)
			- Hello Request (0, 0x00)
			- Client Hello (1, 0x01) <<<<< 별별별
			- Server Hello (2, 0x02)
			- Certificate (11, 0x0B)
			- Server Key Exchange (12, 0x0C)
			- Certificate Request (13, 0x0D)
			- Server Hello Done (14, 0x0E)
			- Certificate Verify (15, 0x0F)
			- Client Key Exchange (16, 0x10)
			- Finished (20, 0x14)
		Change Cipher Spec (20, 0x14)
		Alert (21, 0x15)
		Application Data (23, 0x17)
		*/

		if ((buf[0] == 0x16 && buf[5] == 0x01) &&
			( (buf[1] == 0x03 && buf[2] >= 0 && buf[2] <= 4)
				|| (buf[1] == 0x00 && buf[2] == 0x02)
				)
			)

		{

			lpBuffers->len = CutLen;
			p_WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);

			lpBuffers->len = org_Len - CutLen;
			lpBuffers->buf += CutLen;

			DWORD Result = p_WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);

			lpBuffers->len = org_Len;
			lpBuffers->buf = org_buf;

			*(DWORD *)lpNumberOfBytesSent = org_Len;

			return Result;
		}

	}

	return p_WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);
}

 2,502 total views,  1 views today

댓글 남기기

이메일은 공개되지 않습니다.