Web
- Client-side Basic
- HTTP: Connectionless, Stateless 특성 --> 사용자 식별을 위해 쿠키와 세션 사용
- 공격자: 쿠키,세션에 저장된 세션 아이디 탈취하여 사용자의 권한을 억거나 사용자의 브라우에서 자바스크립트를 실행하는 등의 특별한 행위를 수행해 사용자가 요청을 보낸 것처럼하는 것이 클라이언트 사이드 취약점의 주 목적
- 취약점 발생이유? 웹 브라우저는 Stateful한 상태를 유지하기 위해 모든 HTTP 요청에 쿠키를 함께 보냄
- Same Origin Policy(SOP)
-배경: 자바 스크립트를 통해 페이지 내 있는 요소를 관리 가능, 웹 브라우저를 통해 호스트 요청시 사용자의 정보를 담고 있는 쿠키도 함께 전송 → 외부 리소스를 불러오는 엘리먼트를 사용자 동의없이 해당 내용을 읽거나 변조 가능-->사용자를 보호하기 위해 SOP 정책을 만듬
-서로 다른 오리진의 문서 또는 스크립트 들의 상호작용 제한함->오리진은 프로토콜,포트,호트로 구성되는데 구성요소가 모두 일치해야만 동일한 오리진으로 볼 수 있음
- Cross Origin Resource Sharing(CORS)
-SOP영향으로 다른 오리진과 리소스 공유x-> 개발 또는 운영 목적으로 공유하는 상황 필요
:postMessage-메세지를 주고 받기 위한 이벤트 핸들러 이용
:JSON-스크립트 태그 통해 리소스를 요청(외부)하고 응답 데이터를 callback 함수로
다룸(현재 오리진)
:Cross Origin Resource Sharing(CORS)헤더 사용-설정을 HTTP헤더를 통해
확인,허용 요청
-Cross Site Scripting(XSS)
-임의의 악성 스크립트를 실행할 수 있으며 이를 통해 해당 웹 사이트의 사용자 쿠키 또는 세션을 탈취해 사용자의 권한을 얻거나, 사용자의 페이지를 변조하는 등의 공격을 수행할 수 있습니다.
-조건: 1. 입력 데이터에 대한 충분한 검증 과정이 없어야 함
2.서버의 응답 데이터가 웹 브라우저 내 페이지에 출력 시 충분한 검증 과정이 없어야 한다.
-자바 스크립트의 경우 사용자의 입장에서 발새하는 행위를 동작 시킬 수 있기에 XSS 공격에 많이 사용
-Stored XSS : 공격 스크립트가 서버 내에 존재하는 데이터 베이스 도는 파일 등의 형태로 저장되어 있다가 사용자가 저장된 공격 스크립트를 조회하는 순간 발생하는 형태의 XSS
-Reflected XSS: 사용자의 요청 데이터가 서버의 응답에 포함되는 과정에서 HTML등의 공격 스크립트가 그대로 출력되어 발생하는 XSS
-방어기술:Server-side Mitigations
:HTTPOnly 플래그 사용
-서버 측에서 응답 헤더에 Set-Cookie 헤더를 전송해 쿠키를 생성할 때 옵션으로 설정 가능하며 자바스크립트에서 해당 쿠키에 접근 하는 것을 금지합니다
:Content Security Policy 사용
:X-XSS-Protection
-CSRF
-비 정상적으로 사용자의 의도와 무관하게 다른 사이트에 HTTP 요청을 보내는 것을 CSRF 공격
-CSRF 공격을 성공적으로 수행하기 위해서는 공격자가 사전에 알 수 없는 파라미터가 존재해서는 안되고 해당 웹 사이트가 쿠키를 이용한 인증 방식을 사용해야 한다.
-SameSite Cookie를 Strict 로 설정하면 크로스 사이트에서 시작된 요청에 브라우저는 쿠키를 삽입하지 않습니다 .
- 방어기술
:1.세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증
:2.공격자가 예측할 수 없는 파라미터 추가 및 검증
-Open Redirect
-오픈 리다이렉트 취약점은 사용자가 접속한 도메인 사이트에 대한 신뢰를 무너뜨릴 수 있는 공격으로 오픈 리다이렉트 취약점을 통해 피싱사이트로 접속을 유도하거나, 다른 취약점을 연계하여 사용자를 공격할 수 있습니다.
-오픈 리다이렉트의 공격 방법은 리다이렉트가 발생하는 경로에서 공격자의 입력 값에 의해 리다이렉트되는 주소가 변경 될 경우, 해당 경로와 공격자의 값이 함께 전달되도록 사용자를 유도하여 리다이렉트가 되도록 하는 방법이 있습니다.
-방어
:이동을 허용한 주소에 대해서만 이동하게 끔한다.
:서버에서 해당 링크에 대한 검증을 거친후 사용자에게 배포,외부 링크로 이동하는 것을 알 수 있도록 함
-Click Jacking
-웹 브라우저 화면에 출력되는 내용에 HTML, CSS, JS 등과 같이 화면 출력에 영향을 미치는 요소들을 이용하여 사용자의 눈을 속여 사용자의 클릭을 유도하는 공격 방법
-외부 페이지 리소스를 불러올 수 있는 태그 엘리먼트(<frame>, <iframe>, <object>, <embed>, <applet>)를 사용합니다.
-방어
:Click Jacking은 HTTP 헤더의 ["X-Frame-Options"] 헤더와 CSP의 frame-ancestors 지시어를 통해 방지
- Server-side Basic
-서버에서는 사용자가 요청 한 데이터를 해석하고 처리한 후 사용자에게 응답합니다. 그 과정에서 웹 어플리케이션이나 데이터베이스와 같은 서버의 자원을 사용해 처리하기도 함 이 과정에서 사용자의 요청 데이터에 의해 발생하는 취약점을 서버 사이드 취약점
-Injection
:인젝션 공격은 사용자의 입력 값이 어플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석돼 발생하는 취약점을 의미
-Sql Injection:DBMS에 요청하기 위한 SQL쿼리에 사용자의 입력 데이터가 구조나 문법적으로 해석되어 악용될 수 있는 취약점
-Command InjectionOS: 명렁어를 사용하는 과정에 사용자 입력 데이터도 명령어의 일부로 해석되어 실행되는 취약점
-SSTI :사용자의 입력 데이터를 템플릿으로 사용하여 렌더링 하는 과정에서 템플릿 엔진이 해석하고 실행할 수 있는 문법을 사용하여 공격하는 취약점
-Path Traversal : URL 또는 파일 시스템에서 사용자의 입력 데이터에 의해 경로가 지정되는 경우, 사용자가 입력하는 구분 문자를 통해 서버가 참조하는 경로를 조작할 수 있는 취약점
-Server Side Request Forgery (SSRF) :공격자가 서버에서 변조된 요청을 보낼 수 있는 취약점입니다.
-File Vulnerability
-파일 업로드 취약점:서버의 파일 시스템에 사용자가 원하는 경로 또는 파일 명 등으로 업로드가 가능하여 악영향을 미칠 수 있는 파일이 업로드되는 취약점입니다.
-파일 다운로드 취약점: 서버의 기능 구현 상 의도하지 않은 파일을 다운로드할 수 있는 취약점입니다.
-Business Logic Vulnerability
정상적인 비즈니스 로직을 악용하는 것을 의미합니다. 인젝션, 파일 관련 취약점들은 사용자의 악의적인 데이터가 서버의 시스템 상에서 악영향을 미치는 공격을 수행하지만, 비즈니스 로직 취약점은 서비스의 기능에서 적용되어야 할 로직이 없거나 잘못 설계된 경우 발생하게 됩니다.
-Language specific Vulnerability
-Misconfiguration
:서비스 환경에서 Redis와 같이 내부 또는 특정 서비스에서만 접근 가능하도록 설정되어야 하지만, bind 설정을 0.0.0.0 과 같이 설정하면 외부 사용자도 해당 서비스에 접근가능한 취약점이 발생
- Server-side Advanced - SQL Injection
-SQL Injection 공격 기법
:Logic
논리 연산을 이용한 공격 방법
:Union
SELECT 구문의 Union 절을 이용한 공격 방법입니다.
:Subquery
서브 쿼리는 하나의 쿼리 내에 또 다른 쿼리를 사용하는 것을 의미합니다.
:Error Based
에러 베이스는 이용자가 임의적으로 에러를 발생시켜 정보를 획득하는 공격 기법
:Blind
Blind SQL Injection은 데이터베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용될 수 있는 공격 기법
DBMS의 함수 또는 연산 과정 등을 이용해 데이터베이스 내에 존재하는 데이터와 이용자 입력을 비교하며, 특정한 조건 발생 시 특별한 응답을 발생시켜 해당 비교에 대한 검증을 수행
:Application Logic
데이터베이스의 결과를 받은 어플리케이션에서 결과 값에 따라 다른 행위를 수행하게 되는 점을 이용해 참과 거짓을 구분하는 방법
:Time Based
시간 지연을 이용해 참/거짓 여부를 판단
시간지연을 발생시키는 방법으로는 DBMS에서 제공하는 함수를 이용하거나, 무거운 연산과정을 발생시켜 쿼리 처리 시간을 지연시키는 heavy query 등이 존재
:Error Based Blind
임의적으로 에러 발생을 일으켜 참/거짓을 판단하는 공격 기법
Error Based은 에러 메시지를 통해 데이터가 출력되는 에러를 이용해야 하지만, Error Based Blind 공격 시에는 에러가 발생했다는 여부만을 확인하면 되기 때문에 다른 Runtime Error도 사용가능하다
:Short-circuit evaluation
로직 연산의 원리를 이용한 방법
A 식과 B 식이 있을 때 AND 연산은 모두 참이 되어야 결과가 참이 됩니다. 이때 A가 거짓이라면 B는 연산을 하지 않더라도 결과가 거짓이라는 것을 알 수 있습니다. 그렇기 때문에 실제로 B 식을 수행하지 않는 것을 의미합니다.
-SQL DML 구문
데이터베이스에서 데이터를 조회하거나, 추가/삭제/수정을 수행하는 구문입니다. 즉, 일반적인 이용자가 입력하는 데이터는 대부분 DML을 통해 처리
:SELECT
데이터를 조회하는 구문
:UPDATE
데이터를 수정하는 구문
:INSERT
데이터를 삽입하는 구문
:DELETE
데이터를 삭제하는 구문
-Exploit Technique
1.SQL Injection 취약점 발견
:HTTP Response Status Code를 통해 오류가 발생하는지 확인
:DBMS의 오류 메시지를 통해 취약점 가능성 확인
:웹 어플리케이션에서 변조된 SQL구문이 실행된 데이터가 반환되는지 확인
2.구문 예측 / DBMS 정보 획득
3. Exploit 작성
4.정보 탈취 및 수정/ 삭제
:DBMS Fingerprinting
BlackBox 점검에서 SQL Injection이 의심되는 Endpoint를 찾았을 때 DBMS의 종류를 파악 후 공격하는 것이 효율
:System Tables
DBMS마다 데이터베이스의 정보를 담고 있는 시스템 테이블이 있다.
DB설정, 계정 정보 외에도 데이터베이스/테이블/컬럼 정보, 현재 실행되고 있는 쿼리 정보 등 다양한 정보들을 담고 있다.
이러한 시스템 테이블에 담긴 정보를 통해 SQL Injection 취약점을 좀 더 효율적으로 공격할 수 있다.
:WAF Bypass
WAF(Web Application Firewall, 웹 방화벽)과 같이 웹 해킹에서 주로 공격 시 사용하는 키워드들에 대해 방어하는 시스템이 존재하는 경우가 있다.
주요 키워드 사용을 차단하기 때문에 SQL Injection 취약점이 발생하더라도 공격 코드들이 정상적으로 실행되지 못하는 경우도 발생한다. 하지만 SQL은 다양한 함수와 형태를 지원하는 언어이므로 다양한 방법을 통해 우회할 수 있는 경우들이 있다.
WAF또는 특정 키워드를 방어하는 방식은 공격의 리소스를 증가시키지만, 근본적인 취약점은 해결하지 못한다.
:Out Of DBMS
DBMS에서 제공하는 특별한 함수 또는 기능 등을 이용해 파일 시스템, 네트워크 심지어 OS 명령어 등에도 접근할 수 있다. 이를 통해 SQL Injection을 통해 단순히 데이터베이스의 정보만을 획득하는 것이 아니라 파일 시스템, 네트워크, 시스템 장악까지도 가능할 수도 있다.
해당 공격 방식은 DBMS의 버전과 설정에 따라 정상적으로 동작하지 않을 수 있다. DBMS의 버전이 올라감에 따라 기본적으로 위험한 함수나 기능 등을 제거하거나, 기본 설정/권한으로 접근하지 못하게 하는 등 다양한 방법으로 해당 공격 방식에 대해 패치를 진행하고 있다.
- Server-side Advanced - NoSQL
- NOT Only SQL : 데이터를 다루기 위해 꼭 SQL을 사용하지 않아도 데이터를 다룰 수 있음. NoSQL은 SQL을 사용해 데이터를 조회/추가/삭제하는 관계형 데이터베이스(RDBMS)와 달리 SQL을 사용하지 않음
- MongoDB : key-value의 쌍을 가지는 JSON objects 형태인 도큐먼트를 저장, _id필드가 Primary Key 역할
- 사용 예시
- 쿼리 예시 (의미 : SELECT * FROM inventory WHERE status = "A" and qty < 30;)
- 쿼리 연산자 확인하는 곳 : https://docs.mongodb.com/manual/reference/operator/query/
- 취약점 1 : 대표적으로 MongoDB Injection. 주로 사용자 입력 데이터에 대한 타입 검증이 충분하지 않아 발생. GET 방식과 POST 방식으로 입력 시 서버에서는 사용자의 입력 데이터를 다른 데이터 타입으로 처리할 수도 있음. MongoDB에서는 오브젝트 타입의 입력 데이터로 처리 시 쿼리 연산자등을 사용할 수 있으며, 이를 통해 의도하지 않은 행위를 수행 가능.
- 퀴즈
>> upw에 not equal($ne)연산자를 이용하여 upw값에 상관없이 uid가 "admin"인 데이터를 조회 가능
- 취약점 2 : Blind Injection. 데이터베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용될 수 있는 공격 기법. MongoDB의 Operator($regex, $where)를 사용해 공격 가능.
- $regex 정규식을 사용해 한글자 씩 비교
- $where 연산자를 사용할 수 있거나, $where연산자의 데이터로 입력 값을 추가할 수 있다면 아래와 같이 데이터를 추출 가능. Time Based Error Based 등
- 퀴즈
>> admin의 비밀번호는 5글자
>> 이후에 알파벳 소문자를 비교해 가며 응답 값에 따라 참/거짓을 확인
- Redis - key-value 데이터 모델을 가지며 메모리 기반으로 작동하는 NoSQL DBMS. 메모리 기반이기 때문에 Read/Write 속도가 빨라 다양한 서비스에서 임시 데이터를 캐싱하는 용도
- 예시
- 명령어 리스트 : https://redis.io/commands
- Bug Case : Redis를 사용하는 서비스에서 의도하지 않은 명령어를 실행할 수 있는 버그가 발생. node-redis, SSRF
- Exploit Technique : Redis를 통해 공격할 수 있는 방법. 다른 어플리케이션과 연계, Redis 명령어
- Redis 주의 사항 : 인증 체계, bind, Same Key (Prefix 없는 Key 사용)
- CouchDB : key-value의 쌍인 구조로 JSON objects 형태인 도큐먼트를 저장. HTTP 기반 서버로 REST API 형식으로 HTTP Method(GET, POST, PUT, DELETE 등)를 기반해 요청을 처리
- 예시
- 취약점 : 취약점 : 사용자 입력 데이터에 대한 타입 검증이 충분하지 않거나 특수 구성요소로 사용되어지는 값들에 대한 접근으로 인해 취약점이 발생. NodeJS에서 CouchDB를 사용할 때, apache에서 개발한 nano 패키지를 주로 사용함. nano 패키지에서 데이터를 가져올 때 get 함수를 사용해 문서의 _id 기반으로 가져오거나 find 함수를 사용해 쿼리 기반으로 값을 가져올 수 있음
- Server-side Advanced - Command Injection
- Network Outbound : OS명령어를 실행한 결과를 네트워크 도구를 이용해 외부 서버로 전송시키는 방법 (nc, telnet, curl, wget )
- Reverse Shell / Bind Shell : 쉘 명령어를 네트워크를 통해 입력하거나 출력하여 공격하는 기법. Reverse Shell은 취약점이 발생하는 서버에서 공격자의 서버로 쉘을 연결 (Network Outbound), Bind Shell은 특정 포트로 쉘을 서비스하는 것을 (Network Inbound) 의미 ((sh, nc, perl, python, ruby)
- 파일 생성 : 어플리케이션 상에서 직접적으로 확인할 수 있는 파일 시스템 경로에 결과를 포함한 파일을 생성하거나, 어플리케이션 로직을 통해 확인할 수 있는 공간에 파일을 생성시켜 확인 (php/jsp/asp 파일)
- 지연 시간 (Sleep) : 비교 하는 값이 참일 경우 sleep 명령어를 통해 지연시간을 발생시켜 확인 (id, sleep)
- 에러 (DoS) : 비교하는 값이 참일 경우 시스템 에러를 발생시켜 500 코드(또는 서버 에러를 뜻하는 HTTP 상태 코드)를 확인 (id, cat /dev/urandom)
- 입력 길이가 제한된 상황 - append redirection을 이용해 사용자가 쓰기 권한을 갖고 있는 임시 폴더에 파일을 만드는 방법으로 활용. 한 글자씩 원하는 문자를 파일에 저장한 후 bash나 python과 같은 인터프린터를 이용해 실행하는 방식 // 네트워크를 통해 사용할 명령어를 전송
- 윈도우 환경의 리버스 쉘 스크립트 : https://gist.github.com/egre55/c058744a4240af6515eb32b2d33fbed3
- Server-side Advanced - File Vulnerability
- 리눅스 파일시스템 : 웹 서버는 Unix 계열의 운영체제가 많이 사용(70% 이상)되며, 그중 상당수가 Linux 운영체제를 사용. Unix 운영체제는 "everything is a file," 즉 장치, 프로세스 등 상당수의 객체들을 파일시스템을 통해 제어할 수 있다는 특징을 가지며, 이는 파일 업/다운로드 취약점의 중요성으로 이어짐
- 파일 업로드 시 공격 지점 : 일반적으로 웹 서비스는 root 계정 대신 www-data, nginx, apache와 같은 별도의 사용자로 구동되며, 이상적으로는 ACL(접근 제어 목록) 등의 보안을 통해 웹 서비스 공격 시 그 영향을 최소화해야 함. /etc/passwd는 Unix 계열 시스템에 등록된 사용자 정보를 저장하는 파일로, 웹 서버 공격 시연에서 공격 성공을 보여주기 위해 자주 사용
- 윈도우 파일시스템 : Windows는 기본적으로 Microsoft IIS Server 내장 웹 서버를 제공하며, Apache Web Server나 nginx 등의 소프트웨어 또한 선택 가능, 파일 시스템 접근만으로는 시스템 제어가 어려움
- 파일 업로드 시 공격 지점 : 일반적으로 웹 서비스는 Administrator 나 NT AUTHORITY\SYSTEM 계정 대신 NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService 와 같은 별도의 사용자로 구동되며, 이상적으로는 ACL(접근 제어 목록) 등의 보안을 통해 웹 서비스 공격 시 그 영향을 최소화해야 함
- 파일명 검증 부재
- 파일명 널(NULL) 문자 삽입 : 만약 파일명 파라미터에 %00 과 같은 URL 인코딩이 허용된다면 foo.php%00.jpg 와 같이 확장자 검사를 우회. 이는 운영체제에서 널 문자 앞의 파일명만 인식하기 때문
- Path Traversal : .. 는 특수한 의미를 지니는 디렉터리명으로서 현재 디렉터리를 기준으로 상위 디렉터리를 접근할 수 있도록 함. 만약 웹 응용에서 Path Traversal 공격을 방어하지 않으면 업로드 디렉터리 외 경로의 파일을 접근 가능.
- 잘못된 확장자 검사 : foo.jpg.php 와 같이 파일명의 확장자 부분이 모호한 경우가 있음. 이때 웹 서버와 응용 사이에 확장자를 인식하는 방식이 달라 취약점이 발생
- 파일명 문자열 치환 우회 : foo.p.phphp 와 같은 파일명에서 .php 를 제거하는 경우 foo.php 가 되어 문자열 치환 필터를 우회할 수 있음.
- 파일 삭제 공격 : 대다수의 웹 응용에서는 config.php 와 같은 스크립트 파일로 응용과 관련된 설정 정보를 관리함. 일부 CMS나 게시판 소프트웨어에서는 해당 파일이 존재하지 않거나 빈 파일인 경우 설정이 완료되지 않았다고 간주하여 셋업 페이지에 진입하게 됨. 만일 공격자가 config 파일을 업로드 취약점을 통해 삭제하게 된다면 셋업 페이지를 통해 각종 설정을 변경하거나 웹 응용에 따라서 관리자 권한을 획득할 수 있음
Pwnable
- 시스템 해킹 기초
- 해킹: 시스템을 공격해 의도치 않은 동작을 수행하는 행위
- 시스템 해킹: 소프트웨어를 공격하는 방법의 총칭이라는 의미를 갖고 있음
- 소프트웨어 취약점 발생 원인: 프로그래머의 실수, 개발자의 잘못된 가정 등
- 익스플로잇이란 사전적으로는 악용이라는 뜻을 가지고 있는 단어로, 취약점을 이용해 공격자가 의도한 동작을 수행하게 하는 코드 혹은 이를 이용한 공격 행위
- 소프트웨어 버그는 보안에 영향을 미치는 정도에 따라 크게 4가지로 분류 가능하며, 소프트웨어 버그, 소프트웨어 취약점, 익스플로잇 가능한 취약점, 안정적으로 익스플로잇 가능한 취약점으로 분류됨
- 모든 소프트웨어 취약점은 소프트웨어와 공격자가 상호 작용하는 곳, 즉 사용자의 입력에서부터 발생하는데, 이렇게 공격자가 소프트웨어와 상호 작용할 수 있는 곳을 Attack Vector(공격 벡터)라고 하며, 이러한 Attack Vector들의 집합을 Attack Surface라고 함
- 메모리 커럽션 취약점 종류: Buffer Overflow, Out-Of-Boundary, Off-by-one, Format String Bug, Double Free / Use-After-Free 등
- 로지컬 버그 종류: Command Injection, Race Condition, Path Traversal 등
- 컴퓨터 과학자들은 기본적으로 취약점은 존재한다는 전제하에 시스템을 보호하는 방법을 고민했고, 그래서 등장한게 보호기법(Mitigation)임
- Memory Corruption - C, C++
[ C ]
- 스택 버퍼 오버플로우
가장 초기에 등장한 버퍼 오버플로우 형태 중 하나로, 지역 변수가 할당되는 스택 메모리에서 발생하는 취약점으로, 데이터를 입력받거나 복사하는 부분에 대한 길이 검증이 존재하지 않거나 미흡할 경우에 발생
- 힙 버퍼 오버플로우
동적으로 할당된 힙 메모리 영역에서 발생하는 취약점으로, 데이터를 입력받거나 복사하는 부분에 대한 길이 검증이 존재하지 않거나 미흡할 경우에 발생
- Out-Of-Boundary
버퍼의 길이 범위를 벗어나는 인덱스에 접근할 때 발생하는 취약점으로, 올바르지 않은 값이 버퍼의 인덱스로 사용될 경우 발생
- Off-by-one
버퍼의 경계 계산 혹은 잘못된 반복문의 연산자를 사용하는 등의 인덱스를 고려하지 않을 때 발생하는 취약점
- 포맷 스트링 버그
printf 나 sprintf 함수와 같이 포맷 스트링을 사용하는 함수들을 안전하게 쓰지 않을 때 발생하는 취약점으로, 사용자의 입력이 포맷 스트링으로 전달될 수 있을 때 발생
- Double Free & Use After Free
Double Free는 동적으로 할당된 하나의 힙 메모리를 두 번 해제할 때 발생하는 취약점으로, free와 같이 동적으로 할당된 메모리를 두 번 해제할 때 발생
Use After Free는 동적 할당 시 힙 메모리를 효율적으로 관리하기 위해 기존에 해제되었던 메모리가 반환되어 발생하는 취약점으로, 이미 해제된 메모리를 다시 사용할 수 있을 때 발생
- 초기화되지 않은 메모리
변수를 선언하거나 인스턴스를 생성할 때 초기화를 하지 않을 경우에 발생하는 취약점으로, 할당된 변수가 기존에 있던 쓰레기 값을 가지게 되면서 발생
- Integer issues
정수의 형 변환을 제대로 처리하지 못해 발생하는 문제로, 각각의 자료형에 대한 범위를 고려하지 않을 때 발생하고, 독립적인 취약점으로 사용되기보다는 다른 취약점에 연계되어 사용됨
[ C++ ]
- Buffer Overflow in C++
cin 함수는 길이 검증이 없기 때문에 string과 같이 메모리를 할당하지 않는 타입을 사용한다면 버퍼 오버플로우가 발생함, C++에서 데이터 관리를 편하게 하기 위해 벡터와 큐와 같은 컨테이너들을 지원하지만, 올바르지 않게 사용한다면 버퍼 오버플로우가 발생할 수 있음
- Uninitialized Value
지역 변수나 선언된 클래스의 멤버 변수에 대한 초기화가 이루어지지 않으면 스택에 존재하는 잔여 값을 가지고 있기 때문에 메모리 릭 혹은 임의 주소 쓰기 취약점 등으로 이어질 수 있음
- Use-After-Free
해제된 객체에 대해 다시 접근하려 할 때 Use-After-Free가 발생함, 만약 공격자가 해제된 메모리에 값을 쓸 수 있다면 다른 취약점으로 연계하여 공격할 수 있음, 서로 다른 두 개의 스마트 포인터가 같은 객체를 가리키거나 다른 레퍼런스 카운트 값을 가지게 될 경우에 Use-After-Free가 발생함, 클래스를 복사할 때 호출되는 복사 생성자에서 객체를 새롭게 할당하지 않으면 두 개 이상의 포인터가 같은 영역을 가리킬 수 있음
- Type Confusion
프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점, 잘못된 타입 캐스팅을 사용하여 올바르지 않은 클래스의 타입을 가지게 된다면 Type Confusion이 발생함
- String in C++
string 타입의 객체를 사용할 때 올바르지 않은 함수 사용이나 예외 처리 등이 존재하지 않을 경우에 메모리 릭 혹은 DoS가 발생할 수 있음
- Logical Bugs
- Logical Bugs
- 프로그램의 메모리 관리 실수로 인해 발생하는 메모리 커럽션 취약점과 달리 프로그램의 논리적 오류로 인해 발생
- 논리적 오류는 프로그램이 부정확하게 동작하지만 크래시가 발생하지 않는 경우
- 이와 같은 이유로 로지컬 버그는 발견하기 어려우며 오랜 시간 동안 발견되지 않은 채로 프로그램 내에 존재할 수도 있음
- 이로 인해 프로그램이 기존의 의도대로 동작하지 않아 접근이 불가능한 자원에 접근하여 정보를 탈취하거나 조작할 수 있음
- 이와 같은 문제는 C 혹은 C++과 같은 컴파일 언어 뿐만이 아닌 인터프리터 언어에서도 발생
- Command Injection
- 검증되지 않은 공격자의 입력을 셸 커맨드 또는 쿼리 일부로 처리해 정상적인 실행 흐름을 변경할 수 있는 취약점
- 문자열을 **Structured Query Language(SQL)**의 일부로 처리하면서 발생하는 SQL 인젝션, 문자열의 일부를 셸 커맨드에서 처리하면서 발생하는 커맨드 인젝션이 대표적인 공격
- Command Injection
- 프로그램이 적절한 검증 없이 사용자의 입력을 셸 명령어로 실행할 때 발생하는 취약점
- 공격자는 메타문자와 같은 특수한 문자를 활용해 임의 코드 실행까지 이어지게 할 수 있음
- 메타문자는 리눅스 셸 에서 여러 명령어를 한 줄로 실행할 수 있게 해 주는 특수문자
- Race Condition
- 프로세스 혹은 스레드 간 자원 관리 실수로 인해 발생하는 상태
- 서로 다른 스레드에서 뮤텍스가 걸려 있지 않아 공유 메모리에 접근하는 경우 프로그램의 가정을 파괴할 수 있음
- 이외에도 다양한 환경에서 발생할 수 있으며, 정확히 관리하지 않으면 프로그래머가 실수로 발생시키기 쉬운 오류
-
Path Traversal
- 프로그래머가 가정한 디렉토리를 벗어나 외부에 존재하는 파일에 접근할 수 있는 취약점
- 리눅스의 계정 정보, 서비스의 설정 파일을 읽어 작업 디렉토리를 알아낼 수 있다면 소스 코드 유출, 계정 정보 유출 등으로 이어질 수 있기 때문에 매우 위험
- Linux Exploitation & Mitigation Part
Return Address Overwrite
- 스택 버퍼 오버플로우 취약점이 있을 때에는 주로 스택의 리턴 주소를 덮는 공격을 함
- 리턴 주소는 함수가 끝나고 돌아갈 이전 함수의 주소로, 스택에 저장된 리턴 주소를 다른 값으로 바꾸면 실행 흐름을 조작할 수 있음
NOP Sled
- NOP는 "No OPeration"의 약자로, 명령어 중 하나
- NOP는 `xchg eax, eax`와 같이 프로그램의 실행에 영향을 주지 않는 명령어이기 때문에, 프로그램이 실행 중에 **NOP** 명령어를 만나면 다음 명령어로 넘어가는 것과 같은 효과
- NOP는 주로 명령어의 주소 alignment를 맞출 때 사용
NX bit의 등장
- 프로그램의 공격을 어렵게 하기 위해, 메모리에 쓰기 권한과 실행 권한을 동시에 부여하지 않는 No-eXecute bit(NX bit)가 등장하였습니다.
ASLR
- ASLR(Address Space Layout Randomization)
- 메모리 커럽션 취약점에 대한 공격을 어렵게 하기 위해 프로세스 메모리의 주소 공간을 랜덤화하는 보호 기법
- 서버에 ASLR이 설정되어 있으면 바이너리가 실행될 때마다 힙, 라이브러리, 스택 메모리 영역의 주소가 랜덤하게 바뀜
PLT, GOT
- PLT, GOT 영역 : 랜덤하게 변하는 라이브러리 함수의 주소를 찾기 위해 존재하는 영역
- 바이너리에서 라이브러리 함수를 호출하면 해당 함수의 PLT 영역으로 점프
이후 GOT 영역을 참조해 GOT에 함수의 주소가 없으면 호출된 함수 주소를 구해 GOT 영역에 저장
- ASLR이 설정되어 있는 환경에서도 PLT, GOT 영역의 주소는 변하지 않음 → ASLR 보호기법을 우회하는 데 이를 응용할 수 있음
ROP
- ROP(Return Oriented Programming)
- 바이너리 코드 영역의 여러 코드 가젯들을 조합하여 체이닝해 ASLR 보호기법을 우회하는 공격 기법
FSB
- 포맷 스트링 버그는 사용자의 입력이 `printf`와 같은 함수의 인자로 그대로 전달되어 발생하는 취약점
SSP
- SSP(Stack Smashing Protector)
- 스택에 랜덤 값을 저장시켜 스택 버퍼 오버플로우 취약점을 탐지할 수 있도록 해주는 메모리 보호 기법
RELRO
- RELRO(RELocation Read Only)
- 다이나믹 라이브러리의 함수 주소를 구하는 데 사용되는 relocation 영역에서 쓰기 권한을 없애는 보호 기법
PIE
- PIE(Position Independent Executable)
- Tools
-ROPgadget
ROPGadget은 바이너리에서 ROP(Return Oriented Programming)에 필요한 코드 가젯을 찾아주는 도구
objdump 등을 통한 디스어셈블리 결과에서 코드 가젯을 찾는 것은 시간이 오래 걸리기 때문에 주로 이러한 도구를 사용
설치명령어
pip install ropgadget
-one_gadget
원샷 가젯이란 라이브러리 내에 존재하는 가젯으로, 리눅스 시스템에서 별다른 인자 설정 없이 pc를 바꾸는 것 만으로 셸을 실행시켜 주는 코드 가젯
해커 david942j가 만든 도구로, one_gadget을 사용하면 라이브러리에서 원샷 가젯의 주소와 해당 가젯의 동작 조건을 알 수 있음
설치명령어
apt-get install ruby
$ git clone https://github.com/david942j/one_gadget.git
gem install one_gadget
-pwngdb
pwngdb는 익스플로잇을 할 때 유용한 명령어를 추가한 gdb 플러그인(디버거)
설치명령어
git clone https://github.com/longld/peda.git ~/peda
-pwntools
파이썬은 사용하기 쉬운 스크립트 언어라는 특징 때문에 익스플로잇(취약점 공격)을 할 때 자주 사용
pwntools는 Gallospled 팀이 개발한 파이썬 익스플로잇 프레임워크로, 익스플로잇을 할 때 유용한 여러 기능들을 제공
remote, process, ssh, recv, send ,pack, unpack , ELF, Assembly, Disassembly, shellcraft, cyclic, ROP, fmtstr, 기능 이용가능
설치명령어
apt-get update
apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential
pip install --upgrade pip
pip install --upgrade pwntools
from pwn import *
- Advanced Linux Exploitation
one-shot gadget
함수 포인터를 덮어쓸 수 있다면 pc를 조작할 수 있지만 ROP와 같이 코드를 연계하여 셸을 획득하는 것은 불가능. 이런 상황에서 사용할 수 있는 가젯
원샷 가젯이란 라이브러리 내에 존재하는 가젯으로, 리눅스 시스템에서 특정 조건 하에 pc를 바꾸는 것 만으로 셸을 실행시켜 주는 코드 가젯
원샷 가젯은 libc.so.6 라이브러리 파일 내부에 존재하기 때문에 라이브러리가 매핑된 주소를 알 수 있다면 오프셋 계산을 통해 가젯의 주소 탐색 가능
.init_array & .fini_array
바이너리의 여러 섹션들은 소스코드가 빌드될 때 컴파일러에 의해 만들어집니다. 이 중 .init_array와 .fini_array는 바이너리가 실행되고 종료될 때 참조되는 함수 포인터들이 저장되어 있는 섹션
.fini_array는 프로그램이 종료된 후 참조되는 섹션 따라서 RELRO 보호기법이 설정되어 있지 않고 임의 주소 쓰기가 가능하다면, .fini_array 섹션을 덮어 실행 흐름을 조작하는 것이 가능
_rtld_global Overwrite
_hook Overwrite
GNU C 라이브러리에서는 malloc, realloc, free와 같은 함수들의 동작을 수정할 수 있도록 __malloc_hook, __realloc_hook, __free_hook과 같은 변수를 제공합니다. 이러한 변수에 후킹 함수의 주소가 저장되어 있으면 해당 함수가 호출될 때 기존의 함수가 아닌 후킹 함수가 호출
이런 후킹 변수들은 라이브러리의 쓰기 가능한 영역에 존재하기 때문에 후킹 변수를 사용하는 함수가 있다면 익스플로잇 과정에서 이를 실행 흐름을 조작하는 데 사용 가능
Master canary
SSP 보호 기법이 적용되어 있다면 함수에서 스택을 사용할 때 카나리가 생성
마스터 카나리는 main 함수가 호출되기 전에 랜덤으로 생성된 카나리를 스레드 별 전역 변수
Thread Local Storage(TLS)에 저장됨. 이는 모든 스레드가 하나의 카나리 값을 사용하기 위함
environ ptr
라이브러리에서는 프로그램의 환경 변수를 참조해야 할 일이 있습니다. 이를 위해 libc.so.6에는 environ 포인터가 존재하고, 이는 프로그램의 환경 변수를 가리키고 있습니다
environ 포인터는 로더의 초기화 함수에 의해서 초기화
SECCOMP
SECure COMPuting mode(SECCOMP)는 리눅스 커널에서 프로그램의 샌드박싱 매커니즘을 제공하는 컴퓨터 보안 기능
샌드박스는 시스템 오류나 취약점으로 인한 2차 피해를 막기 위해 프로그램의 권한을 분리하기 위한 보안 매커니즘
seccomp를 이용하면 프로세스가 필요로 하지 않지만 위험한 시스템 콜들에 대한 호출 방지
SROP
리눅스에서는 시그널이 들어오면 커널 모드에서 처리하게 되는데, 커널 모드에서 유저 모드로 돌아오는 과정에서 유저의 스택에 레지스터 정보들을 저장
rt_sigreturn은 이렇게 저장해놓은 정보들을 다시 돌려놓을 때 사용
만약 공격자가 rt_sigreturn 시스템 콜을 호출할 수 있고 스택을 조작할 수 있다면 모든 레지스터와 세그먼트를 조작할 수 있음
이처럼 rt_sigreturn 시스템 콜을 사용하여 익스플로잇하는 기법을 SigReturn Oriented Programming(SROP)이라 함
_IO_FILE
_IO_FILE은 리눅스 시스템의 표준 라이브러리에서 파일 스트림을 나타내기 위한 구조체
프로그램이 fopen과 같은 함수를 통해 파일 스트림을 열 때 힙에 할당
_IO_FILE - flags
_flags 필드는 해당 파일이 가지고 있는 여러 성질들을 플래그로 나타내는 필드
- Heap Allocator Exploit
ptmalloc2 allocator
ptmalloc2는 리눅스 GLIBC 에서 사용하는 메모리 할당자
운영체제마다 메모리 할당자가 동작하는 방식은 각각 다르며, ptmalloc2는 리눅스 유저 모드에서 주로 사용하는 할당자
동적으로 할당된 힙 메모리는 하나의 청크(Chunk) 라고 불리며, 청크는 malloc_chunk 구조체를 사용합니다. 힙 청크는 목적에 따라 다음과 같이 다양한 이름으로 불립니다.
Allocate Chunk
malloc이나 calloc 함수 등 동적 메모리 할당 함수를 통해 할당된 청크를 말합니다.
Free Chunk
free 함수 등 동적 메모리 해제 함수를 통해 해제된 청크를 말합니다.
Top Chunk
힙 메모리의 마지막에 위치해있는 청크를 말합니다. Top Chunk의 마지막은 힙 메모리 영역의 끝입니다. 메모리 할당 요청이 들어왔을 때, 사용할 적절한 Free Chunk가 없으면 Top Chunk를 쪼개어 사용합니다.
Last Remainder Chunk
작은 사이즈의 할당 요청이 들어왔을 때, Free Chunk가 쪼개지고 남은 청크를 말합니다. Last Remainder Chunk는 연속된 작은 사이즈의 할당 요청이 들어왔을 때 비슷한 주소에 힙 청크가 할당되는 할당의 지역성을 유지시키기 위해 사용됩니다.
main_arena
main_arena는 brk 시스템 콜을 사용하여 할당된 힙을 효율적으로 관리하기 위해 존재하는 malloc_state구조체
Fastbin
fastbin은 작은 크기의 힙 청크를 할당하고 해제할 때 사용하는 bin
fastbin은 다른 bin과는 달리 단일 연결 리스트를 사용하고 메모리 검증 루틴이 적기 때문에 ptmalloc2의 bin 중 할당 및 해제 속도가 가장 빠름
또한 할당 및 해제 시 LIFO(Last In First Out) 방식으로 청크를 처리하며, 다른 두 개의 청크가 인접해 있어도 하나의 청크로 병합되지 않음.
unsorted bin
unsorted bin은 smallbin과 large bin 크기의 힙 청크가 해제되면 이후 재할당을 위해 사용되는 bin입니다.
bin의 개수는 1개이며, 해당 bin의 용도는 해제된 청크를 재사용하기 위해서 존재
smallbin
smallbin은 512 바이트 미만의 사이즈로 청크가 해제 되었을 때 unsorted bin에 리스트가 추가된 후 저장되는 bin입니다. bin의 개수는 62개이며, 이중 연결 리스트를 사용합니다. 해당 bin에는 두 개의 해제된 청크가 인접해 있을 수 없습니다. 만약 인접해 있다면 하나의 청크로 병합
smallbin은 이중 연결 리스트와 FIFO구조를 사용
smallbin 크기의 힙 청크가 해제되면 unsortedbin을 거쳐 smallbin에 할당
large bin
large bin은 512 바이트 이상의 큰 크기의 청크가 해제 되었을 때 사용되는 bin
large bin의 개수는 63개이며, 이중 연결 리스트를 사용
large bin 청크의 구조체는 다른 bin과는 다르게 fd_nextsize와 bk_nextsize를 사용
large bin은 FIFO 구조를 사용
Security check
_int_malloc
_int_malloc과 _int_free는 개발자의 실수, 악의적인 행위 등으로 힙이 정상적으로 동작하지 않는 것을 방지하기 위해 검증 코드가 존재
검증 코드를 이해하고 있다면 익스플로잇을 할 때 이를 우회하여 공격 가능
_int_free
unlink
unlink 매크로는 두 개의 힙 청크가 연속적으로 해제되었을 때 두 청크를 병합하기 위하여 사용
Double Free
Double Free는 해제된 힙 청크를 다시 해제할 때 발생하는 버그
힙을 해제하면 bin이라는 연결 리스트에 추가되고, 이는 힙을 재할당할 때 참조, 해당 버그가 발생하면 연결 리스트에 중복된 힙 주소를 추가하기 때문에 두 개의 객체가 동일한 메모리를 사용 가능
fastbin dup
fastbin dup은 Double Free 버그를 이용하여 fastbin freelist를 조작해 이미 할당된 메모리에 다시 힙 청크를 할당하는 공격 기법
이를 이용하면 fastbin의 FD 포인터를 조작해 임의 주소에 힙 청크를 할당 가능
fastbin poisoning은 해제된 fastbin 힙 청크의 FD를 조작해 임의의 주소에 힙 청크를 할당하는 공격 기법
fastbin dup consolidate
fastbin dup consolidate는 fastbin에 들어간 힙 청크들을 병합시켜 smallbin에 넣어 Double Free 검증을 우회하는 기법
smallbin에 들어간 fastbin 크기의 힙 청크를 한 번 더 해제하면 다시 fastbin에 들어가기 때문에 검증을 우회 가능
Unsafe unlink
Unsafe unlink는 해제된 청크들을 연결하는 이중 연결 리스트에서 청크를 연결 해제하는 매크로인 unlink를 이용해 임의 주소 쓰기를 하는 공격 기법
이 기법은 전역 버퍼와 같이 주소를 알고 있는 위치에 unlink될 청크의 주소가 저장되어 있는 경우에 사용
unlink 매크로는 인접한 2개 이상의 청크를 연속해서 해제했을 때 인접한 청크를 병합하기 위해서 사용
Memory Leak
메모리 누수(memory leak) 현상은 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상
unsorted bin attack
unsorted bin attack은 해제된 청크의 BK 포인터를 조작할 수 있을 때, 임의 주소에 main_arena 영역의 주소를 쓸 수 있는 공격 기법
쓰여지는 값은 주로 특정 버퍼의 사이즈를 덮는 등 추가적인 공격을 연계하기 위해 사용
unsorted bin은 크기에 상관없이 청크의 재할당을 위해 사용되는 bin
Overlapping chunks
Overlapping chunks 기법은 해제된 힙의 size를 조작할 수 있을 때 사용할 수 있는 기법
해제된 힙의 size를 기존 힙 청크의 크기보다 큰 값으로 조작하고 할당하면 다른 힙 청크의 영역을 침범하여 메타데이터를 덮어씀
Poison NULL Byte
Poison NULL Byte 기법은 한 바이트의 NULL을 추가로 입력하여 인접한 힙 청크의 size 하위 1 바이트를 덮을 수 있을 때 다른 기법으로 연계할 수 있는 공격 기법
Large Bin Attack
Large Bin Attack 기법은 해제된 large bin을 조작하여 원하는 주소에 힙 청크의 주소를 덮어쓸 수 있는 공격 기법
해당 기법은 다음과 같은 조건 필요
1.unsorted bin 청크를 만들 수 있어야 합니다.
2.large bin 청크를 만들 수 있어야 합니다.
3.해제된 large bin의 BK, bk_nextsize를 조작할 수 있어야 합니다.
House of Lore
House of Lore는 smallbin 크기의 힙이 존재할 때 bck->fd를 조작하여 임의의 주소에 청크를 할당할 수 있는 공격 기법
할당을 원하는 영역에 Fake chunk를 구성하고 bck->fd를 조작할 수 있다면 원하는 주소에 힙 청크를 할당 가능
House of Force
House of Force 기법은 top chunk의 size를 조작함으로써 임의의 주소에 힙 청크를 할당 할 수 있는 공격 기법
Tcache
tcache는 glibc 2.26 버전 이후에 힙 메모리 관리의 속도 향상을 위해 추가된 메커니즘
Tcache dup
tcache dup은 Double Free 버그를 이용하여 tcache_entry를 조작해 이미 할당된 메모리에 다시 힙 청크를 할당하는 공격 기법
Heap Feng Shui
Heap Feng Shui는 힙의 레이아웃을 조작하여 원하는 객체를 덮어쓸 수 있게 하는 기법
리얼 월드에서는 프로그램의 코드가 큰 만큼 동적 할당도 많이 이루어지기 때문에 힙 오버플로우 취약점이 있다 하더라도 원하는 객체를 덮어쓰는 것이 어려움
덮어쓸 객체의 낮은 주소에 힙 오버플로우가 발생하는 힙을 할당하여 덮어써야 함.
Breaking calloc
alloc은 malloc과 같이 동적으로 메모리를 할당하는 함수입니다. calloc은 할당과 동시에 메모리를 초기화하기 때문에 기존에 남아있던 데이터의 재사용을 방지
calloc 함수를 호출하되, 메모리를 초기화하지 않고 할당하는 기법
Tcache House of Spirit
House of Spirit 기법은 free 함수의 인자를 조작하여 임의의 메모리를 해제할 수 있을 때 사용할 수 있는 기법
해당 기법으로 원하는 주소에 힙을 할당해 임의의 주소에 값 사용 가능
해당 기법을 사용하기 위해서는 예제 코드와 같이 스택 주소를 알고 해당 영역을 해제 가능해야함
만약 해당 영역에 값을 쓸 수 있다면 스택 내에 존재하는 다른 지역 변수나 리턴 주소 변경 가능
tcache double free bypass
GLIBC 2.29 버전은 tcache를 사용하는 청크의 Double Free를 검증하기 때문에 이전과 같은 방법으로 tcache dup, poisoning 기법을 사용해 공격 불가능
그러나 힙 오버플로우 혹은 Use-After-Free와 같은 취약점이 발생한다면 검증을 우회해 공격 가능
'4-7. 2021-2 심화 스터디 > CTF' 카테고리의 다른 글
[2021.11.06] dreamhack, HackCTF reversing, CTF문제풀이 (0) | 2021.11.06 |
---|---|
[2021.10.09] HackCTF 풀이 (0) | 2021.10.09 |
[2021.09.25] HackCTF풀이 (0) | 2021.10.08 |
[2021.09.18] Dreamhack rev-basic 외 풀이 (0) | 2021.09.18 |
CTF 자료 조사 및 학습 계획 (0) | 2021.09.04 |