기본 콘텐츠로 건너뛰기

7월, 2017의 게시물 표시

Buffer-Overflows_2

Buffer-Overflows_2 Off-by-one buffer overflow 는 단일 바이트 값이 오버플로우된 경우로 보통 Null 종료 버그 나 libc 함수 사용 시 계산 실수로 인해 발생된다. Adjacent memory overflows 는 Null 종료 버그 를 이용하여 두 문자열을 연결하는 경우로 메모리 상에서 두 버퍼가 나란히 붙어있어 이러한 명칭을 가진다. 예를 들어 Null 종료 버그 로 인해 종료가 제대로 되지 않으면 strlen() 함수와 같이 Null 종료 에 의존적인 함수들이 인접한 메모리를 계속 읽게 된다. Off-by-one buffer overflow 다음은 Off-by-one buffer overflow 의 예시로 메모리 색인 시 Off-by-one buffer overflow 가 발생한다. static int b64_decode( const char * str, unsigned char * space, int size ) { const char * cp; int space_idx, phase; int d, prev_d = 0 ; unsigned char c; space_idx = 0 ; phase = 0 ; for ( cp = str; *cp != '\0' ; ++cp ) { d = b64_decode_table[( int ) *cp]; if ( d != - 1 ) { switch ( phase ) { case 0 : ++phase; break ; case 1 : c = ( ( prev_d << 2 ) |

build with Address sanitizer

Address Sanitizer와 함께 빌드하기 GCC와 CLANG로 빌드 시 Adress sanitizer를 구성하는 예시이다. 오브젝트 코드 주소를 소스 코드 행 번호와 파일 이름으로 변환하려면 ASAN_OPTIONS=symbolize=1 옵션이 필요하다. GCC 사용 시 권장 방법은 -static-libasan 을 사용하여 ASAN에 정적으로 링크하는 것이다. ( ldd 명령어를 이용하여 이를 확인해보자.) ldd ldd(List Dynamic Dependencies)는 프로그램이나 공유 라이브러리들이 요구하는 공유 라이브러리(shared libraries)를 출력하는 명령 행(Command Line)프로그램이다. –version : ldd의 버전을 출력한다. -v, –verbose : 심볼 버전 정도등 모든 정보를 출력한다. -d, –data-relocs -r, –function-relocs –help : 사용방법을 출력한다. 출처 : joinc - ldd main.cpp 다음은 스택 오버플로우 취약점이 있는 간단한 소스코드이다. int main( int argc, char **argv) { int stack_array[ 100 ]; stack_array[ 1 ] = 0 ; return stack_array[argc + 100 ]; // BOOM } Makefile . PHONY: using -gcc using -gcc -static using -clang using -gcc : g ++- 4.8 -o main -gcc -lasan -O -g -fsanitize = address -fno -omit -frame -pointer main . cpp && \ ASAN_OPTIONS = symbolize = 1 ASAN_SYMBOLIZER_PATH = $(shell which llvm -s

Buffer-Overflows_1

Buffer-Overflows_1 버퍼 오버플로우 취약점은 힙 기반과 스택 기반 두 가지 종류로 분류한다. 힙 기반 오버플로우 는 동적으로 메모리를 할당할 때 메모리 영역에 과도한 값을 채워 넣어 유발시키며 보통 프로그래머의 계산 실수로 발생된다. 스택 기반 오버플로우 는 정적인 크기의 로컬 버퍼에서 저장하도록 의도된 것에 비해 많은 데이터를 의도적으로 삽입하여 발생시킨다. Stack Based 다음은 스택 기반 오버플로우의 예시로 일반적으로 사용되는 IMAP 서버의 cyrus-imapd에서 발생된 오버플로우이다. IMAP(Ineternet Message Access Protocol) 응용 계층 인터넷 프로토콜 중 하나로, 원격 서버로부터 TCP/IP 연결을 통해 이메일을 가져오는데 사용된다. 출처: 위키피디아 Cyrus IMAP Server Cyrus IMAP Server는 카네기 멜론 대학교에서 개발한 이메일 서버 소프트웨어이다. static int popd_canon_user(sasl_conn_t *conn, void *context, const char *user, unsigned ulen, unsigned flags, const char *user_realm, char *out, unsigned out_max, unsigned *out_ulen) { char userbuf[MAX_MAILBOX_NAME+ 1 ], *p; size_t n; int r; if (!ulen) ulen = strlen (user); if (config_getswitch(IMAPOPT_POPSUBFOLDERS)) { //if popsubfolders //configed /* make a working copy of the auth[z]id *

CVE-2016-5180

CVE-2016-5180 1-byte-write-heap-buffer-overflow in c-ares c-ares 는 비동기 DNS 요청을 위한 C 라이브러리이다. c-ares 에서 발견된 heap buffer overflow 취약점 CVE-2016-5180을 알아보자. target.cc c-ares 퍼징 테스트를 위해 작성된 target.cc 파일을 먼저 살펴보자. #include <stdint.h> #include <stdlib.h> #include <string> #include <arpa/nameser.h> #include <ares.h> extern "C" int LLVMFuzzerTestOneInput( const uint8_t *Data, size_t e) { unsigned char *buf; int buflen; std :: string s( reinterpret_cast < const char *>(Data), Size); ares_create_query(s.c_str(), ns_c_in, ns_t_a, 0x1234 , 0 , &buf, buflen, 0 ); free (buf); return 0 ; } ares_create_query 함수 인자 값으로 Data 값을 캐스팅하여 전달한다. ares_create_query : 단일 DNS 쿼리 버퍼 작성 reinterpret_cast : 포인터를 다른 포인터 형식으로 변환 string.c_str() : string 문자열의 첫번째 문자의 주소를 반환 이제 빌드하여 분석을 해보자. mkdir -p ~/c-ares-CVE- 2016 - 5180 ; rm -rf ~/c-ares-CVE- 2016 - 5180 ; cd ~/c-ares-CVE- 2016 - 5180 ~/FTS/c-ares-C

CVE-2017-11691

Cacti: CVE-2017-11691: Cross-site scripting Cacti 는 네트워크 그래프 솔루션으로 쉬운 인터페이스와 PIA(Plugin Architecture) 패치를 통해 적용 가능한 다양한 플러그인들로 인해 많은 사용자들이 이용하고 있다. Referer 값에 스크립트 구문 삽입 시 해당 스크립트가 동작되는 XSS(Cross Site Scripting) 취약점이 1.1.13 버전에서 발생하였다. 취약점이 발생한 파일은 auth_profile.php 로 현재는 조치가 완료된 상태이다. POC 요청 시 Referer 값에 스크립트 구문 삽입 http://192.168.1.206/cacti/auth_profile.php?action=edit Referer: test4fun’;alert(1)// 페이지 내 'Return' 버튼 선택 스크립트 동작 확인 Fix Referer 값을 htmlspecialchars() 함수를 이용하여 치환하는 방식으로 조치되었다. htmlspecialchars() 특수문자를 HTML 인코딩 형식으로 치환 '&' : '&amp;' '"'(겹따옴표) : '&quot;' '''(홑따옴표) : '&#039;' '<' : '&lt;' '>' : '&gt;' $( 'input[value="<?php print __esc(' Return ');?>"]' ).unbind().click( function (event) { - document.location = '<?php print $_SESSION[' profile_referer '];?>

CVE-2014-0160_LIBFUZZER

CVE-2014-0160(HeartBleed)_LIBFUZZER 벌써 발견된지 3년이나 지난 취약점이 된 HeartBleed 를 이용해서 LIBFUZZER 사용법을 숙지해보자. 구글에서는 친절하게 LIBFUZZER 를 학습할 수 있게 Testcase 들을 제공해주고 있다. target.cc Openssl 퍼징 테스트를 위해서 작성된 target.cc 파일을 먼저 살펴보자. #include <openssl/ssl.h> #include <openssl/err.h> #include <assert.h> #include <stdint.h> #include <stddef.h> #ifndef CERT_PATH # define CERT_PATH #endif SSL_CTX *Init() { SSL_library_init(); SSL_load_error_strings(); ERR_load_BIO_strings(); OpenSSL_add_all_algorithms(); SSL_CTX *sctx; assert (sctx = SSL_CTX_new(TLSv1_method())); /* These two file were created with this command: openssl req -x509 -newkey rsa:512 -keyout server.key \ -out server.pem -days 9999 -nodes -subj /CN=a/ */ assert(SSL_CTX_use_certificate_file(sctx, CERT_PATH "server.pem" , SSL_FILETYPE_PEM)); assert(SSL_CTX_use_PrivateKey_file(sctx, CERT_PATH "server.key" ,

American Fuzzy Lop And Address Sanitizer

American Fuzzy Lop And Address Sanitizer Address Sanitizer(ASAN) 단지 gcc/clang에 -fsanitize=address 옵션을 추가하는 것으로 간단히 사용할 수 있지만 그 효과는 충분하다. Example Out Of Bounds Read #include <stdio.h> int main() { int a[ 2 ] = { 3 , 1 }; int i = 2 ; printf ( "%i\n" , a[i]); } 예제 파일을 OutOfBoundsRead.c 로 생성하고 ASAN 옵션을 지정하여 clang 으로 컴파일하자. clang -g -fsanitize = address -fno -omit -frame -pointer OutOfBoundsRead . c -o OutOfBoundsRead 생성된 OutBoundsRead 파일을 실행하면 다음과 같은 결과를 볼 수 있다. ================================================================= ==3678==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc0ba87428 at pc 0x47b7db bp 0x7ffc0ba87390 sp 0x7ffc0ba87388 READ of size 4 at 0x7ffc0ba87428 thread T0 ==3678==WARNING: Trying to symbolize code, but external symbolizer is not initialized! #0 0x47b7da (/root/ASAN/OutOfBoundsRead+0x47b7da) #1 0x7faba0260f44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44) #2 0x

Ubuntu apt-get Trubleshooting

Ubuntu apt-get Trubleshooting 우분투 설치 시 수행하는 여러가지 일들 중 하나가 저장소 주소 변경이다. 한국에서는 대부분 ftp.daumkakao.com 을 설정하여 사용한다. 그런데 저장소로( ftp.daumkakao.com 을 포함한 다른 저장소들 모두) 직접 접근은 되는 데, apt-get 명령어를 통해서는 동작하지 않을 때가 있다. 회사 내부에서 우분투를 사용하기 위해서 설정하던 중 해결 방안을 찾고 정리한다. 저장소 주소 변경 작업 Vim /etc/apt/source.list :%s/kr.archive.ubuntu.com/ftp.daumkakao.com/g apt-get clean apt-get update Truble Shooting 문제 확인 아래 명령어를 수행하여 문제점을 찾아보자. apt -get -o Debug ::Acquire ::http = true update strace -s 1024 apt -get update 본인의 경우 User-Agent: Debian APT-HTTP/1.3 를 보고 User-Agent 를 변경하는 것으로 apt 를 정상적으로 사용할 수 있었다. /etc/apt/apt.conf 파일 생성 및 수정 /etc/apt/apt.conf 파일을 생성한다. sudo vi /etc/apt/apt.conf User Agent 를 Mozilla로 수정한다. Acquire { http : :User-Agent "Mozilla/5.0 (Windows NT 5.1; rv:25.0) Gecko/20100101 Firefox/25.0" ; } ; apt 업데이트 sudo apt-get update