1 / 85

Section IV. 웹 취약점 분석도구의 활용 23. 개요 24. 파로스 소스 커스터마이징을 통한 취약점 분석 - 설치 및 구성

Section IV. 웹 취약점 분석도구의 활용 23. 개요 24. 파로스 소스 커스터마이징을 통한 취약점 분석 - 설치 및 구성 - 탐지항목 ( 룰 종류 ) - 백업 파일 찾기 - 사설 IP 검색 로직 찾기 - 디렉토리 노출 찾기 - IIS 기본 파일 찾기 - 파라미터 변조 - SQL Injection Fingerprinting - 소스 컴파일 - SQL Injection 탐지 패턴 추가

ula
Download Presentation

Section IV. 웹 취약점 분석도구의 활용 23. 개요 24. 파로스 소스 커스터마이징을 통한 취약점 분석 - 설치 및 구성

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Section IV. 웹 취약점 분석도구의 활용 23. 개요 24. 파로스 소스 커스터마이징을 통한 취약점 분석 - 설치 및 구성 - 탐지항목(룰 종류) - 백업 파일 찾기 - 사설 IP 검색 로직 찾기 - 디렉토리 노출 찾기 - IIS 기본 파일 찾기 - 파라미터 변조 - SQL Injection Fingerprinting - 소스 컴파일 - SQL Injection 탐지 패턴 추가 - 주민등록번호 검색 기능 추가

  2. 학습 포인트 1. 파로스(웹 스캐너)의 구성요소에 대한 이해 2. 파로스의 룰 구현 원리에 대한 이해 3. 파로스 룰 확장(응용)

  3. 23. 개요 웹 사이트 개발 시 보안을 고려하지 않고 개발하는 경우 수정에 많은 비용 발생 버그 탐지 시점(개발 이후 운영단계) SDLC 개발공정상의 버그 수정비용

  4. 23. 개요 요구사항 수렴 요구사항 및 분석 그리고 개발자 교육 디자인/설계 개별 객체 모듈과 보안 모듈 연동 설계, 보안 체크 리스트 작성, 보안 개발 지침 작성 개발 보안체크 리스트와 보안개발 지침참조, 코드 리뷰 테스트 코드 리뷰(White Box Test), 체크 리스트 검증 * White Box Test : 소스 검사 운영 및 유지보수 코드 리뷰(Black Box Test), 보안 솔루션 운영, 보안 패치 * Black Box Test : 스캐너 검사

  5. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 01. 설치(*src.zip 받고, 압축해제)

  6. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 • 02. 구성 • Crawl • html 태그 정보를 통해 디렉토리 구조와 파일형태를 수집하는 모듈 • Scan • Crawl에서 수집된 정보를 이용하여 패턴을 조작하여 전송하는 모듈 • (3) Report • 결과를 출력하는 모듈 • (4) Proxy • 웹 브라우저와 스캐너를 Proxy로 연동시키는 모듈

  7. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 02. 구성 - Crawl

  8. 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

  9. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 02. 구성 – Scan(내부 데이터 검사 사례) Response Header 원하는 문자열 포함 여부 확인 ( 사설 IP ) Response Data

  10. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 03. 탐지항목 - UI 점검 항목 테스트 항목

  11. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 03. 탐지항목 – 룰 분류

  12. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 03. 탐지항목

  13. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 ○소스 상단 : 함수 및 패턴 선언 ○소스 중간 : 리포트 내용(제목, 해결책 등) 및 패턴 전송 부분 선언 ○소스 하단 : 탐지근거 선언

  14. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 소스 상단 부분

  15. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 소스 중간 부분 리포트 내용 패턴 전송 로직

  16. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 소스 하단 부분

  17. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기

  18. 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 작성 함수

  19. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속)

  20. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) 자체적으로 작성한 에러 페이지 기본 에러 페이지

  21. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속)

  22. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 백업 파일 찾기(계속) getdescription() getName() getsolution() getreference()

  23. 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. 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

  25. 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; }

  26. 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( 파일 백업 )

  27. 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 디렉토리 혹은 파일이름에 백업 확장자 삽입 파일 확장자에 백업 확장자 삽입

  28. 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()함수 호출을 통해 리포트로 출력

  29. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색 사설 IP주소는 왜 필요한가? - IPV4 주소의 고갈로 인해 할당해 줄 주소가 없다.

  30. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 사설 IP 검색 소스: C:\paros-3.2.13-src\paros \src\org\parosproxy\paros\core\scanner\plugin\TestInfoPrivateAddressDisclosure.java

  31. 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)

  32. 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"

  33. 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); } }

  34. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출 디렉토리 노출(Directory Browsing)인 경우 어떻게 분석할 수 있는가?

  35. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 디렉토리 노출(계속) 디렉토리 노출 검색 패턴 전송 (패턴비교)

  36. 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);

  37. 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“;

  38. 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 헤더 값을 만들어 다시 넣음 }

  39. 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); // 데이터 전송 및 수신

  40. 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); }

  41. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기

  42. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) • 일반 룰 • 패턴 정의 • 리포트 출력 정의 • 패턴 송, 수신 정의 • 판단 근거 정의 • 기본 파일 찾기 룰 • 패턴 정의 • 리포트 출력 정의 • 다른 파일에서 송,수신및 판단근거 public class TestDefaultFileIIS extends AbstractDefaultFilePlugin {

  43. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – IIS 기본 파일 찾기(계속) public class TestDefaultFileIIS extends AbstractDefaultFilePlugin { 일반 룰 IIS 기본패턴 찾기 룰 등

  44. 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"

  45. 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(슈퍼 클래스)를 선언

  46. 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");

  47. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 파라미터 변조 로직

  48. 24. 파로스 소스 커스터마이징을 통한 취약점 분석 04. 로직분석 – 파라미터 변조 로직(계속) private static String[] PARAM_LIST = {"", "", "@", "+", AbstractPlugin.getURLDecode("%00") , "|"};

  49. 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+|&nbsp)*VBScript(\\s+|&nbsp)+error", PATTERN_PARAM); private static Pattern patternErrorODBC1 = Pattern.compile("Microsoft OLE DB Provider for ODBC Drivers.*error", PATTERN_PARAM); private static

More Related