860 likes | 1.06k Views
Section IV. 웹 취약점 분석도구의 활용 23. 개요 24. 파로스 소스 커스터마이징을 통한 취약점 분석 - 설치 및 구성 - 탐지항목 ( 룰 종류 ) - 백업 파일 찾기 - 사설 IP 검색 로직 찾기 - 디렉토리 노출 찾기 - IIS 기본 파일 찾기 - 파라미터 변조 - SQL Injection Fingerprinting - 소스 컴파일 - SQL Injection 탐지 패턴 추가
E N D
Section IV. 웹 취약점 분석도구의 활용 23. 개요 24. 파로스 소스 커스터마이징을 통한 취약점 분석 - 설치 및 구성 - 탐지항목(룰 종류) - 백업 파일 찾기 - 사설 IP 검색 로직 찾기 - 디렉토리 노출 찾기 - IIS 기본 파일 찾기 - 파라미터 변조 - SQL Injection Fingerprinting - 소스 컴파일 - SQL Injection 탐지 패턴 추가 - 주민등록번호 검색 기능 추가
학습 포인트 1. 파로스(웹 스캐너)의 구성요소에 대한 이해 2. 파로스의 룰 구현 원리에 대한 이해 3. 파로스 룰 확장(응용)
23. 개요 웹 사이트 개발 시 보안을 고려하지 않고 개발하는 경우 수정에 많은 비용 발생 버그 탐지 시점(개발 이후 운영단계) SDLC 개발공정상의 버그 수정비용
23. 개요 요구사항 수렴 요구사항 및 분석 그리고 개발자 교육 디자인/설계 개별 객체 모듈과 보안 모듈 연동 설계, 보안 체크 리스트 작성, 보안 개발 지침 작성 개발 보안체크 리스트와 보안개발 지침참조, 코드 리뷰 테스트 코드 리뷰(White Box Test), 체크 리스트 검증 * White Box Test : 소스 검사 운영 및 유지보수 코드 리뷰(Black Box Test), 보안 솔루션 운영, 보안 패치 * Black Box Test : 스캐너 검사
24. 파로스 소스 커스터마이징을 통한 취약점 분석 01. 설치(*src.zip 받고, 압축해제)
24. 파로스 소스 커스터마이징을 통한 취약점 분석 • 02. 구성 • Crawl • html 태그 정보를 통해 디렉토리 구조와 파일형태를 수집하는 모듈 • Scan • Crawl에서 수집된 정보를 이용하여 패턴을 조작하여 전송하는 모듈 • (3) Report • 결과를 출력하는 모듈 • (4) Proxy • 웹 브라우저와 스캐너를 Proxy로 연동시키는 모듈
24. 파로스 소스 커스터마이징을 통한 취약점 분석 02. 구성 - Crawl
24. 파로스 소스 커스터마이징을 통한 취약점 분석 02. 구성 - Scan ○패턴 삽입 : 확인된 디렉토리에 보유한 패턴 전송 / /admin.jsp , /manual.php, /menu.asp ○패턴 조합 : 수집된 파라미터 값 조작 및 전송 Crawl 단계에서 수집된URL : /bbs/bbs.asp?id=1000 Scan 단계에서 전송되는 패턴 : /bbs/bbs.asp?id=1000'INJECTED_PARAM ○내부 데이터 검사 : Crawl 단계에서 수집된 정보만을 활용 /bbs.jsp, /bbs1.jsp, /bbs2.jsp
24. 파로스 소스 커스터마이징을 통한 취약점 분석 02. 구성 – Scan(내부 데이터 검사 사례) Response Header 원하는 문자열 포함 여부 확인 ( 사설 IP ) Response Data
24. 파로스 소스 커스터마이징을 통한 취약점 분석 03. 탐지항목 - UI 점검 항목 테스트 항목
24. 파로스 소스 커스터마이징을 통한 취약점 분석 03. 탐지항목 – 룰 분류
24. 파로스 소스 커스터마이징을 통한 취약점 분석 03. 탐지항목
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 ○소스 상단 : 함수 및 패턴 선언 ○소스 중간 : 리포트 내용(제목, 해결책 등) 및 패턴 전송 부분 선언 ○소스 하단 : 탐지근거 선언
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 소스 상단 부분
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 소스 중간 부분 리포트 내용 패턴 전송 로직
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 소스 하단 부분
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) C:\paros-3.2.13-src\paros \src\org\parosproxy\paros\core\scanner\plugin\TestObsoleteFile.java package org.parosproxy.paros.core.scanner.plugin; // 소스의 위치 import java.io.IOException; // 입출력 관련 함수 import java.util.regex.Pattern; // 정규표현식 함수 import org.apache.commons.httpclient.URI; // URI표현 함수 import org.parosproxy.paros.core.scanner.AbstractAppPlugin; // 백업파일 찾기를 지원하는 클래스 정의 import org.parosproxy.paros.core.scanner.Alert; // 결과물에 대한 위험도 정의 import org.parosproxy.paros.network.HttpMessage; // HTTP Protocol 작성 함수
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속)
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) 자체적으로 작성한 에러 페이지 기본 에러 페이지
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속)
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) getdescription() getName() getsolution() getreference()
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) public int getCategory() { return 0; } C:\paros-3.2.13-src\paros\src\org\parosproxy\paros\core\scanner\Category.java public class Category { 2 public static final int INFO_GATHER = 0; 3 public static final int BROWSER = 1; 4 public static final int SERVER = 2; 5 public static final int MISC = 3; 6 public static final int INJECTION = 4; 7 private static String[] names = { 8 "Information gathering", 9 "Client browser", 10 "Server security", 11 "Miscellenous", 12 "Injection"
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) 1. public void scan() 함수 호출 public void scan() { for (int i=0; i<staticSuffixList.length; i++) { // for 반복문으로 백업패턴 처음부터 끝까지 카운트 try { testSuffix(staticSuffixList[i], false); testSuffix(staticSuffixList[i], true); // testSuffix() 함수 호출 인자값은 2개(staticSuffixList[i], false/true) 가 넘어감 2 public void testSuffix() 함수 호출 private void testSuffix(String suffix, boolean replaceSuffix) -------- --------------- 인자값1 인자값2
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) private void testSuffix(String suffix, boolean replaceSuffix) throws IOException { HttpMessage msg = getNewMsg(); // 패턴 전송을 위한 http 생성 URI uri = msg.getRequestHeader().getURI(); // getURI()를 통해 Crawl단계에서 수집된 정보를 uri 변수에 저장 // getURI() http://www.xxx.com/bbs/bbs.asp?id=1 String path = uri.getPath(); // getPath()를 통해 디렉토리와 페이지 정보만 가져옴(파라미터 제외) // getPath() /bbs/bbs.asp if (path == null || path.equals("")) { // 정보가 없다면 skip return; }
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) testSuffix(staticSuffixList[i], false); testSuffix(staticSuffixList[i], true); private void testSuffix(String suffix, boolean replaceSuffix) throws IOException { { … … if (replaceSuffix) { int pos = path.lastIndexOf("."); if (pos > -1) { path = path.substring(0, pos); // /bbs/bbs.asp일 경우 // path = /bbs/bbs까지만(디렉토리 백업) } } path = path + suffix; true일 경우 False일경우 // path = bbs/bbs.asp( 파일 백업 )
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) testSuffix(staticSuffixList[i], false); testSuffix(staticSuffixList[i], true); private void testSuffix(String suffix, boolean replaceSuffix) throws IOException { String path = uri.getPath(); /bbs/bbs.asp if (replaceSuffix) /bbs/bbs.asp path = path + suffix; /bbs/bbs.bak path = path + suffix; /bbs/bbs.asp.bak replaceSuffix = true replaceSuffix = False 디렉토리 혹은 파일이름에 백업 확장자 삽입 파일 확장자에 백업 확장자 삽입
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) uri.setPath(path); // 백업 확장자 붙인 URI 세팅 msg.getRequestHeader().setURI(uri); // HTTP 프로토콜 생성(백업확장자 붙인 URI) sendAndReceive(msg); // HTTP 프로토콜 전송 및 수신 if (!isFileExist(msg)) { // 수신 헤더 값을 보아서 파일이 존재하는 경우 return; } bingo(Alert.RISK_LOW, Alert.WARNING, uri.toString(), "", "", msg); // bingo()함수 호출을 통해 리포트로 출력
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색 사설 IP주소는 왜 필요한가? - IPV4 주소의 고갈로 인해 할당해 줄 주소가 없다.
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색 소스: C:\paros-3.2.13-src\paros \src\org\parosproxy\paros\core\scanner\plugin\TestInfoPrivateAddressDisclosure.java
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색(계속) * 사설 IP 주소범위 10.0.0.0 - 10.255.255.255 (10/8 prefix) 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색(계속) • public int getId() { • return 00003; • } • public String getName() { • return "Private IP disclosure"; • } • public String[] getDependency() { • return null; • } • public String getDescription() { • return "Private IP such as 10.x.x.x, 172.x.x.x, 192.168.x.x is found in the HTTP response body. This can be used in exploits on internal system."; • } • public int getCategory() { • return Category.INFO_GATHER; • } public class Category { 2 public static final int INFO_GATHER = 0; 3 public static final int BROWSER = 1; 4 public static final int SERVER = 2; 5 public static final int MISC = 3; 6 public static final int INJECTION = 4; 7 private static String[] names = { 8 "Information gathering", 9 "Client browser", 10 "Server security", 11 "Miscellenous", 12 "Injection"
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색(계속) public void scan() { HttpMessage msg = getBaseMsg(); // 기존 정보이용인 경우 // HttpMessage msg = getNewMsg(); 신규 프로토콜인 경우 String txtBody = msg.getResponseBody().toString();// 수신정보중 body만 가져와 txtBody에 저장 String txtFound = null; // txtFound 변수 초기화 Matcher matcher = patternPrivateIP.matcher(txtBody); // 사설 IP 정의한 패턴과 비교 while (matcher.find()) { // 패턴 매치결과가 존재한다면 txtFound = matcher.group(); if (txtFound != null) { bingo(Alert.RISK_LOW, Alert.WARNING, null, null, txtFound, msg); } }
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출 디렉토리 노출(Directory Browsing)인 경우 어떻게 분석할 수 있는가?
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) 디렉토리 노출 검색 패턴 전송 (패턴비교)
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) public class TestDirectoryBrowsing extends AbstractAppPlugin { private final static Pattern patternIIS = Pattern.compile("Parent Directory", PATTERN_PARAM); private final static Pattern patternApache = Pattern.compile("\\bDirectory Listing\\b.*(Tomcat|Apache)", PATTERN_PARAM); private final static Pattern patternGeneralDir1 = Pattern.compile("\\bDirectory\\b", PATTERN_PARAM); private final static Pattern patternGeneralDir2 = Pattern.compile("[\\s<]+IMG\\s*=", PATTERN_PARAM); private final static Pattern patternGeneralParent = Pattern.compile("Parent directory", PATTERN_PARAM);
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) public class Category { 2 public static final int INFO_GATHER = 0; 3 public static final int BROWSER = 1; 4 public static final int SERVER = 2; 5 public static final int MISC = 3; 6 public static final int INJECTION = 4; 7 private static String[] names = { 8 "Information gathering", 9 "Client browser", 10 "Server security", 11 "Miscellenous", 12 "Injection" public int getId() { return 00001; } public String getName() { return "Directory browsing"; } public String getDescription() { return "It is possible to view the direc"; } public int getCategory() { return Category.SERVER; } public String getSolution() { return "Disable directory browsing not induce risks."; } public String getReference() { String ref = "For IIS, turn off directory browsing.\r\n" + "For Apache, use the 'Options -Indexes“;
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) private void checkIfDirectory(HttpMessage msg) throws URIException { URI uri = msg.getRequestHeader().getURI(); // crawl 데이터 가져오기 http://www.xxx.com/bbs/bbs.asp?id=1 uri.setQuery(null); // 불필요한 파라미터 값 제거 http://www.xxx.com/bbs/bbs.asp String sUri = uri.toString(); // uri 가져오기 if (!sUri.endsWith("/")) { // 가져온 값 끝이 / 로 끝나지 않는 경우 sUri = sUri + "/"; // / 를 강제로 붙임 } msg.getRequestHeader().setURI(new URI(sUri, true)); // / 를 붙인 url 헤더 값을 만들어 다시 넣음 }
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) checkIfDirectory() /bbs/ /bbs/bbs.asp/ /dir1/ public void scan() { boolean result = false; // result 변수에 false로 선언(값 없음으로 시작 HttpMessage msg = getNewMsg(); // 신규 http 프로토콜 생성 int reliability = Alert.WARNING; // 취약점 결과 수준을 warning 으로 초기화 try { checkIfDirectory(msg); // checkIfDirectory()함수 호출 writeProgress(msg.getRequestHeader().getURI().toString()); // 만든 header를 다시 불러오기 sendAndReceive(msg); // 데이터 전송 및 수신
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) if (msg.getResponseHeader().getStatusCode() != HttpStatusCode.OK) { return; } if (matchBodyPattern(msg, patternIIS, null)) { result = true; } else if (matchBodyPattern(msg, patternApache, null)) { result = true; } else if (matchBodyPattern(msg, patternGeneralParent, null)) { result = true; reliability = Alert.SUSPICIOUS; 수신된 URL의 응답코드 OK = 200번 수신된 URL의 Body 정의된 IIS 디렉토리 노출 패턴 동일한 패턴이 있다면 Result()함수 호출 if (result) { bingo(Alert.RISK_MEDIUM, reliability, msg.getRequestHeader().getURI().toString(), "", "", msg); }
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) • 일반 룰 • 패턴 정의 • 리포트 출력 정의 • 패턴 송, 수신 정의 • 판단 근거 정의 • 기본 파일 찾기 룰 • 패턴 정의 • 리포트 출력 정의 • 다른 파일에서 송,수신및 판단근거 public class TestDefaultFileIIS extends AbstractDefaultFilePlugin {
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) public class TestDefaultFileIIS extends AbstractDefaultFilePlugin { 일반 룰 IIS 기본패턴 찾기 룰 등
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) public intgetId() { return 20000; } public String getName() { return "IIS default file"; } public String getDescription() { return "Microsoft IIS 4.0, 5.0 or 6.0 default files are found."; } public intgetCategory() { return Category.SERVER; } public String getSolution() { return "Remove default files and virtual directories."; } public class Category { 2 public static final int INFO_GATHER = 0; 3 public static final int BROWSER = 1; 4 public static final int SERVER = 2; 5 public static final int MISC = 3; 6 public static final int INJECTION = 4; 7 private static String[] names = { 8 "Information gathering", 9 "Client browser", 10 "Server security", 11 "Miscellenous", 12 "Injection"
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) public void init() { super.init(); // 슈퍼 클래스 createURI(); } C:\paros-3.2.13-src\paros\src\org\parosproxy\paros\core\scanner \AbstractDefaultFilePlugin.java 에서 처리 즉 다른 소스 내용(AbstractDefaultFilePlugin.java)을 호출하기 위해서는 super class(슈퍼 클래스)를 선언
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) private void createURI() { // 패턴 선언 addTest("/","iisstart.asp,postinfo.html,_vti_inf.html"); addTest("msadc","msadcs.dll"); addTest("_vti_bin", "fpcount.exe,shtml.dll"); addTest("_vti_bin/_vti_adm", "admin.dll"); addTest("_vti_bin/_vti_aut", "author.dll");
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 파라미터 변조 로직
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 파라미터 변조 로직(계속) private static String[] PARAM_LIST = {"", "", "@", "+", AbstractPlugin.getURLDecode("%00") , "|"};
24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 파라미터 변조 로직(계속) * 에러 문자열 정의( 패턴 전송 후 에러 발생 여부를 확인하기 위한 에러 문자열 ) private static Pattern patternErrorJava1 = Pattern.compile("javax\\.servlet\\.\\S+", PATTERN_PARAM); private static Pattern patternErrorJava2 = Pattern.compile("invoke.+exception|exception.+invoke", PATTERN_PARAM); private static Pattern patternErrorVBScript = Pattern.compile("Microsoft(\\s+| )*VBScript(\\s+| )+error", PATTERN_PARAM); private static Pattern patternErrorODBC1 = Pattern.compile("Microsoft OLE DB Provider for ODBC Drivers.*error", PATTERN_PARAM); private static