Security

[๊ณผ์ œ ์ •๋ฆฌ] SSL library hooking

๋‚จ๋ฐ”์˜ค 2023. 3. 17. 23:06

FILE HOOK์„ ์ˆ˜์ •ํ•ด์„œ SSL ํ†ต์‹ ๊ณผ์ •์„ ๋กœ๊ทธ๋กœ ๋‚จ๊ธฐ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์ œ์˜€๋‹ค.

์šฐ์„  ์•„๋ž˜๋Š” SSL์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ hook.c ์ฝ”๋“œ์ด๋‹ค.

#hook.c
#define _GNU_SOURCE
#include<stdio.h>
#include<dlfcn.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/ssl.h>

extern char * __progname;
static int (*hook_SSL_read)(SSL *ssl, char *buf, int num) = NULL;

//SSL_read hooking
int SSL_read(SSL *ssl, void *buf, int num){
  //SSL_read ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ๋”
	if (hook_SSL_read == NULL) hook_SSL_read = dlsym(RTLD_NEXT, "SSL_read");

	char* buf_ = buf;
	//hookingํ•œ ๋‚ด์šฉ์€ txt๋กœ ์ €์žฅ๋˜๋„๋ก
	FILE *fp = NULL;
	if ( fp = fopen("/tmp/hook.txt", "a+")){
		fprintf(fp, "%s", buf_);
	}
	fclose(fp);
	
	//return hook_ret;
	return hook_SSL_read(ssl, buf, num);
}

void __attribute__ ((constructor)) before_load(void)
{
	if (hook_SSL_read == NULL)hook_SSL_read = dlsym(RTLD_NEXT, "SSL_read");
}

wget ๊ธฐ๋Šฅ์— ์กด์žฌํ•˜๋Š” opensslํ•จ์ˆ˜์•ˆ์— ์žˆ๋Š” SSL_read ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ˜•ํ•˜์—ฌ ์›๋ž˜ ํ•จ์ˆ˜๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ๋™์ž‘ํ•˜๋Š” ๋‚ด์šฉ์€ ๋กœ๊ทธ ํŒŒ์ผ๋กœ ์ €์žฅ์ด ๋˜๊ฒŒ๋” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด ์ฃผ์†Œ๋ฅผ returnํ•ด์ฃผ๋Š” dlsym ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋˜์–ด ์žˆ๋Š” ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‘ ๊ฐœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก RTLD_NEXT ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์ฒ˜์Œ์—๋Š” ./run.sh๋กœ ์‹คํ–‰์„ ์‹œ์ผœ๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ /etc/ld.so.preload์— write๊ฐ€ ๊ณ„์† ๋˜์ง€ ์•Š์•„ LD_PRELOAD๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.