93
A Link to the Past Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1

SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

A Link to the PastAbusing Symbolic Links on WindowsJames Forshaw @tiraniddoSyScan 2015

1

Page 2: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Obligatory Background Slide

● Researcher in Google’s Project Zero team

● Specialize in Windows○ Especially local privilege

escalation● Never met a logical

vulnerability I didn’t like

https://www.flickr.com/photos/barretthall/2478623520/

2

Page 3: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

What I’m Going to Talk About

● Implementation of Symbolic Links on Windows● Exploitable Bug Classes● Example vulnerabilities● Offensive exploitation tricks

3

Page 4: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Symbolic Links

4

Page 5: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Dangers of Symbolic Links

5

Page 6: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Resource Creation or Overwrite

6

Privileged Application

\path\to\resource

Write to resource

\sensitive\pathSymbolic Link

Page 7: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Information Disclosure

7

Privileged Application

\path\to\resource

Read Resource

\sensitive\pathSymbolic Link

Disclosure

Unprivileged Application

Page 8: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Time of Check/Time of Use

8

Privileged Application

\path\to\resource

Check and use

Resource

\valid\fileCheck

Symbolic Link

\malicious\file

Use Symbolic Link

Page 9: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

History of Windows Symbolic Links

Windows NT 3.1 - July 27 1993Object Manager Symbolic LinksRegistry Key Symbolic Links

9

Page 10: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

History of Windows Symbolic Links

Windows NT 3.1 - July 27 1993Object Manager Symbolic LinksRegistry Key Symbolic Links

Windows 2000 - Feb 17 2000NTFS Mount Points and Directory Junctions

10

Page 11: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

History of Windows Symbolic Links

Windows NT 3.1 - July 27 1993Object Manager Symbolic LinksRegistry Key Symbolic Links

Windows 2000 - Feb 17 2000NTFS Mount Points and Directory Junctions

Windows Vista - Nov 30 2006NTFS Symbolic Links

11

Page 12: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Symbolic Links

12

Page 13: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Named Objects

13

IO/File\??\C:\Windows\notepad.exe\Device\NamedPipe\mypipe

Registry\Registry\Machine\Software

Semaphore\BaseNamedObjects\MySema

Page 14: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Creating Object Manager Symbolic Links

HANDLE CreateSymlink(LPCWSTR linkname, LPCWSTR targetname){ OBJECT_ATTRIBUTES obj_attr; UNICODE_STRING name, target; HANDLE hLink;

RtlInitUnicodeString(&name, linkname); RtlInitUnicodeString(&target, targetname);

InitializeObjectAttributes(&objAttr, &name, OBJ_CASE_INSENSITIVE, nullptr, nullptr);

NtCreateSymbolicLinkObject(&hLink, SYMBOLIC_LINK_ALL_ACCESS, &obj_attr, &target); return hLink;}

14

Page 15: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Parsing Name

Object Manager Reparsing

NtOpenSemaphore

15

\MyObjects\Global\MySema

Page 16: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Reparsing

NtOpenSemaphore ObOpenObjectByName

16

Parsing Name

\MyObjects\Global\MySema

Page 17: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Reparsing

NtOpenSemaphore ObOpenObjectByName ObpLookupObjectName

17

Parsing Name

\MyObjects\Global\MySema

Current Component

Page 18: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Reparsing

NtOpenSemaphore ObOpenObjectByName ObpLookupObjectName

18

Parsing Name

\MyObjects\Global\MySema

Current Component

Page 19: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Reparsing

NtOpenSemaphore ObOpenObjectByName ObpLookupObjectName

ObpParseSymbolicLink

19

Parsing Name

\MyObjects\Global\MySema

Current Component

Global → \BaseNamedObjects

Page 20: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Reparsing

NtOpenSemaphore ObOpenObjectByName ObpLookupObjectName

ObpParseSymbolicLink

20

Parsing Name

\MyObjects\Global\MySema

\BaseNamedObjects\MySema

Global → \BaseNamedObjects

Page 21: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Reparsing

NtOpenSemaphore ObOpenObjectByName ObpLookupObjectName

ObpParseSymbolicLink

STATUS_REPARSE

21

Parsing Name

\BaseNamedObjects\MySema

Page 22: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Abusing Object Manager Symbolic Links

● Most obvious attack is object squatting○ Redirect privileged object creation to another name○ Open named pipes for attacking impersonation○ Shadowing ALPC ports

● File symlink attacks perhaps more interesting!

22

Page 23: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Example VulnerabilityIE EPM MOTWCreateFile Information

Disclosure

23

Page 24: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

IE Shell Broker MOTWCreateFile

24

HANDLE MOTWCreateFile(PCWSTR FileName, ...) { if (FileHasMOTW(FileName) || IsURLFile(FileName)) { return CreateFile(FileName, GENERIC_READ, ...); } }

BOOL IsURLFile(PCWSTR FileName) { PCWSTR extension = PathFindExtension(FileName); return wcsicmp(extension, L".url") == 0;}

Page 25: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Win32 Path Support

Path Description

some\path Relative path to current directory

c:\some\path Absolute directory

\\.\c:\some\path Device path, canonicalized

\\?\c:\some\path Device path, non-canonicalized

Interesting!

Page 26: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Win32 to Native NT File Paths

26

\\.\c:\some\pathWin32 Path

Page 27: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Win32 to Native NT File Paths

27

\\.\c:\some\path

\??\c:\some\path

Win32 Path

Native Path

RtlDosPathNameToRelativeNtPathName

Page 28: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Win32 to Native NT File Paths

28

\\.\c:\some\path

\??\c:\some\path

Win32 Path

Native Path

RtlDosPathNameToRelativeNtPathName

\Device\HarddiskVolume4\some\path

ObpLookupObjectName

After Lookup

Page 29: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Global Root Symlink

29

\\.\GLOBALROOT\some\pathWin32 Path

Empty Symlink

Path

Page 30: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Global Root Symlink

30

\\.\GLOBALROOT\some\path

\??\GLOBALROOT\some\path

Win32 Path

Native Path

RtlDosPathNameToRelativeNtPathName

Empty Symlink

Path

Page 31: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Global Root Symlink

31

\\.\GLOBALROOT\some\path

\??\GLOBALROOT\some\path

Win32 Path

Native Path

RtlDosPathNameToRelativeNtPathName

\some\path

ObpLookupObjectName

After Lookup

Empty Symlink

Path

Page 32: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Writeable Object Directories from IE Sandbox

32

Path Sandbox

\RPC Control PM

\Sessions\X\BaseNamedObjects PM

\Sessions\X\AppContainerNamedObjects\SID\... EPM

Page 33: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Exploiting

IShDocVwBroker* broker;

CreateSymlink(L"\\RPC Control\\fake.url", L"\\??\\C:\\some\\file");

broker->MOTWCreateFile(L"\\\\.\\GLOBALROOT\\RPC Control\\fake.url",

...);

// Read File

33

Page 34: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Example Vulnerability

34

Adobe Flashbroker Incorrect Canonicalization Sandbox Escape

Page 35: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

BrokerCreateFile

HANDLE BrokerCreateFile(PCWSTR FileName, ...) { if (IsSafePath(FileName)) { return CreateFile(FileName, ...); }}

35

Reuses the original FileName

Can we bypass IsSafePath?

Page 36: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Path Canonicalization

BOOL IsSafePath(PCWSTR FileName) { if (wcsnicmp(FileName, L"\\\\?\\") == 0) { FileName = &FileName[4]; } CanonicalizePath(FileName, CanonicalPath); return IsInSafeLocation(CanonicalPath);}

36

Removes device prefix

Page 37: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

NTFS Invalid Filename Characters

37

Page 38: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Object Manager Invalid Filename Characters

38

Page 39: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

What IsSafePath Saw

39

\\?\GLOBALROOT\RPC Control\../../C:/valid/path

C:\valid\path

Canonicalize Path

Page 40: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

What CreateFile Saw

40

\\?\GLOBALROOT\RPC Control\../../C:/valid/path

\??\GLOBALROOT\RPC Control\../../C:/valid/path

RtlDosPathNameToRelativeNtPathName

Object Directory Single Symbolic Link

Page 41: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Registry Key Symbolic Links

41

Page 42: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Under the hood

42

NtOpenKey ObOpenObjectByName ObpLookupObjectName

Parsing Name

\Registry\Machine\Mylink

Page 43: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Under the hood

43

NtOpenKey ObOpenObjectByName ObpLookupObjectName

CmpParseKey

Parsing Name

\Registry\Machine\Mylink CmpGetSymbolicLink

Current Component

Page 44: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Under the hood

44

NtOpenKey ObOpenObjectByName ObpLookupObjectName

CmpParseKeySTATUS_REPARSE

CmpGetSymbolicLink

Parsing Name

\Registry\Machine\Mylink

\Registry\Machine\NewKey

Page 45: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Serious Limitations

● Windows 7 fixed numerous issues with registry symbolic links○ Blocked symlinks between untrusted (user) and trusted (local

machine) hives○ Symbolic link must be a valid registry path

● MS10-021 ensured it was also available downstream● Still can exploit user to user vulnerabilities such as in IE EPM

○ CVE-2013-5054○ CVE-2014-6322

● Mitigation (pass flag to RegCreateKeyEx) still undocumented

45

Page 46: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

NTFS Mount Points / Directory Junctions

46

Page 47: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Under the hood

47

NtOpenFile ObOpenObjectByName ObpLookupObjectName

IopParseDevice

Parsing Name

\??\C:\temp\mylink\file NTFS Driver

Page 48: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Under the hood

48

NtOpenFile ObOpenObjectByName ObpLookupObjectName

IopParseDevice

Parsing Name

\??\C:\temp\mylink\file

\??\C:\Windows

NTFS Driver

Page 49: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Under the hood

49

NtOpenFile ObOpenObjectByName ObpLookupObjectName

IopParseDevice

NTFS Driver

STATUS_REPARSE

Parsing Name

\??\C:\Windows\file

Page 50: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Structure of a Mount Point

typedef struct MOUNT_POINT_REPARSE_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1];};

50

Set to 0xA0000003 for Mount Point

Substitute NT Name

Print Name?

String Data

Header

Reparse Data

Page 51: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Create a Mount Point

PREPARSE_DATA_BUFFER reparse_buffer = BuildMountPoint(target);CreateDirectory(dir); HANDLE handle = CreateFile(dir, ..., FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, ...); DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, reparse_buffer, reparse_buffer.size(), ...);

51

Page 52: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Mount Point Limitations

● Directory must be empty to set the reparse data● Target device must be an IO device (no opening registry keys for

example)● Target device heavily restricted in IopParseDevice:

52

IO_PARSE_CONTEXT *ctx;

if (ctx->LastReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { switch(TargetDeviceType) { case FILE_DEVICE_DISK: case FILE_DEVICE_CD_ROM: case FILE_DEVICE_VIRTUAL_DISK: case FILE_DEVICE_TAPE: break; default: return STATUS_IO_REPARSE_DATA_INVALID; }}

Limited Device Subset

Page 53: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Example VulnerabilityWindows Task Scheduler TOCTOU Arbitrary

File Creation

53

Page 54: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Running a Scheduled Task

54

void Load_Task_File(string task_name, string orig_hash) { string task_path = "c:\\windows\\system32\\tasks\\" + task_name; string file_hash = Hash_File(task_path); if (file_hash != orig_hash) { Rewrite_Task_File(task_path); }}

Hash task file contents

Rewrite Task without Impersonation

Page 55: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

System Task Folder

Writable from normal user privilege, therefore can create a mount point directory

55

Page 56: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Winning the Race Condition

56

Hash File Rewrite Task File???? Profit?

Page 57: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Is that an OPLOCK in your Pocket?

void SetOplock(HANDLE hFile) { REQUEST_OPLOCK_INPUT_BUFFER inputBuffer; REQUEST_OPLOCK_OUTPUT_BUFFER outputBuffer; OVERLAPPED overlapped; overlapped.hEvent = CreateEvent(...); DeviceIoControl(hFile, FSCTL_REQUEST_OPLOCK, &inputBuffer, sizeof(inputBuffer), &outputBuffer, sizeof(outputBuffer), nullptr, &overlapped); WaitForSingleObject(overlapped.hEvent, ...); }

57

Page 58: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

User Application

ExploitationTask Scheduler Service

58

IRegisteredTask::Run

Current Mount Point:MyTaskFolder → C:\dummy

Open File for ReadingC:\Dummy\MyTask

Page 59: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

User Application

ExploitationTask Scheduler Service

59

IRegisteredTask::Run

Current Mount Point:MyTaskFolder → C:\windows

Open File for ReadingC:\Dummy\MyTask

Change Mount Point Location

Event Set

Page 60: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

User Application

ExploitationTask Scheduler Service

60

IRegisteredTask::Run

Current Mount Point:MyTaskFolder → C:\windows

Open File for ReadingC:\Dummy\MyTask

Release OplockChange Mount Point Location

Event Set

Page 61: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

User Application

ExploitationTask Scheduler Service

61

IRegisteredTask::Run

Current Mount Point:MyTaskFolder → C:\windows

Open File for ReadingC:\Dummy\MyTask

Generate and Verify Hash of File

C:\Dummy\MyTask

Release OplockChange Mount Point Location

Event Set

Page 62: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

User Application

ExploitationTask Scheduler Service

62

IRegisteredTask::Run

Current Mount Point:MyTaskFolder → C:\windows

Open File for ReadingC:\Dummy\MyTask

Rewrite Task FileC:\Windows\MyTask

Generate and Verify Hash of File

C:\Dummy\MyTask

Release OplockChange Mount Point Location

Event Set

Page 63: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

OPLOCK Limitations

● Can’t block on access to standard attributes or FILE_READ_ATTRIBUTES

● One-shot, need to be quick to reestablish if opened multiple times● Can get around attribute reading in certain circumstances by

oplocking a directory.● For example these scenarios opens directories for read access

○ Shell SHParseDisplayName accesses each directory in path○ GetLongPathName or GetShortPathName○ FindFirstFile/FindNextFile

63

Page 64: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

DEMOOPLOCKs in Action

64

Page 65: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

NTFS Symbolic Links

65

Page 66: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Structure of a Symbolic Link

typedef struct SYMLINK_REPARSE_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; USHORT Flags; WCHAR PathBuffer[1];};

66

Set to 0xA000000C for SymlinkHeader

Reparse Data

Flags:0 - Absolute path1 - Relative path

Page 67: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Create Symlink Privilege

Admin user - Yay!

Normal user - Boo :-(

67

Page 68: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Create Symbolic Link Privilege

NTSTATUS NtfsSetReparsePoint(NTFS_CREATE_CONTEXT* ctx) { // Validation ... PREPARSE_DATA_BUFFER* reparse_buf; if ((reparse_buf->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) && (ctx->Type != FILE_DIRECTORY)) { return STATUS_NOT_A_DIRECTORY; } if ((reparse_buf->ReparseTag == IO_REPARSE_SYMLINK) && ((ctx->Flags & 0x400) == 0)) { return STATUS_ACCESS_DENIED } // ...}

68

Page 69: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Create Symbolic Link Privilege

NTSTATUS NtfsSetReparsePoint(NTFS_CREATE_CONTEXT* ctx) { // Validation ... PREPARSE_DATA_BUFFER* reparse_buf; if ((reparse_buf->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) && (ctx->Type != FILE_DIRECTORY)) { return STATUS_NOT_A_DIRECTORY; } if ((reparse_buf->ReparseTag == IO_REPARSE_SYMLINK) && ((ctx->Flags & 0x400) == 0)) { return STATUS_ACCESS_DENIED } // ...}

Context must contain 0x400 flag

69

Page 70: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Flags Setting

NTSTATUS NtfsSetCcbAccessFlags(NTFS_FILE_CONTEXT* ctx) {

ACCESS_MODE AccessMode = NtfsEffectiveMode();

if (ctx->HasRestorePrivilege) { ctx->Flags |= 0x400; }

if (AccessMode == KernelMode || SeAccessCheck(&SeCreateSymbolicLinkPrivilege, &security_ctx, UserMode)) { ctx->Flags |= 0x400; } // ...}

70

Page 71: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Hypothetical Scenario

NTSTATUS Handle_OpenLog(PIRP Irp) {

OBJECT_ATTRIBUTES objattr; UNICODE_STRING name;

RtlInitUnicodeString(&name, L"\\SystemRoot\\LogFiles\\user.log"); InitObjectAttributes(&objattr, &name, 0, 0, 0, 0); PHANDLE Handle = Irp->AssociatedIrp->SystemBuffer; return ZwCreateFile(Handle, &objattr, ...);}

71

Returns handle to user mode process

Page 72: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

DEMO

72

Stupid Explorer Symlink Behaviour

Page 73: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo 73

SMBv2 Symbolic Links

https://msdn.microsoft.com/en-us/library/cc246542.aspx

Page 74: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

SMBv2 Symbolic Link Restrictions

74

● Remote to Local would be useful

● Disabled by default in local security policy

Page 75: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Back to IopParseDevice

enum SymlinkDeviceType { Local, Network };

if (ctx->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { // ... }else { SymlinkDeviceType target_type = GetSymlinkDeviceType(TargetDeviceType);

if (target_type == Local || target_type == Network) { if (!NT_SUCCESS(IopSymlinkEnforceEnabledTypes( target_type, ctx->last_target_type))) { return STATUS_IO_REPARSE_DATA_INVALID; } }}

75

Enforces Symlink Traversal based on device types

Page 76: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

MRXSMB20

NTSTATUS Smb2Create_Finalize(SMB_CONTEXT* ctx) { // Make request and get response if (RequestResult == STATUS_STOPPED_ON_SYMLINK) { result = FsRtlValidateReparsePointBuffer( ctx->ErrorData, ctx->ErrorDataLength); if (!NT_SUCCESS(result)) { return result; } } // ...}

76

No check on ReparseTag

Page 77: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

SMBv2 Device Type Bypass

77

NtOpenFile ObpLookupObjectName

IopParseDevice

SMB2 Driver

Parsing Name

\\server\share\file

Current Component

Server

Create share\file

Page 78: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

SMBv2 Device Type Bypass

78

NtOpenFile ObpLookupObjectName

IopParseDevice

SMB2 Driver

STATUS_REPARSE

Parsing Name

\\server\share\file

Current Component

Server

STATUS_STOPPED_ON_SYMLINKwith

IO_REPARSE_TAG_MOUNT_POINT

Page 79: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

SMBv2 Device Type Bypass

79

NtOpenFile ObpLookupObjectName

IopParseDevice

SMB2 Driver

Parsing Name

\\server\share\file

\??\C:\hello.txt

Server

NTFS Driver

Page 80: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

DEMO

80

SMBv2 Local File Disclosure in IE

Page 81: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

File Symbolic Links - Without Permissions

81

Page 82: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

First Try

Default CreateFile call won’t open the file. Returns Access Denied

82

Page 83: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Success

FILE_FLAG_BACKUP_SEMANTICS allows us to open the file

83

Page 84: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

The NtCreateFile ParadoxFILE_DIRECTORY_FILE Flag

FILE_NON_DIRECTORY_FILE Flag

84

Neither FILE_DIRECTORY_FILE or FILE_NON_DIRECTORY_FILE

Page 85: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

The Old ADS Directory Trick

Using $INDEX_ALLOCATION stream will bypass initial directory failure

85

Page 86: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Let Our Powers Combine

86

Page 87: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Let Our Powers Combine

87

NtOpenFile ObpLookupObjectName

IopParseDevice

Parsing Name

\??\C:\temp\mylink

\RPC Control\mylink

NTFS Driver

STATUS_REPARSE

Page 88: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo 88

NtOpenFile ObpLookupObjectName

IopParseDevice

NTFS Driver

ObpParseSymbolicLink

STATUS_REPARSE

Parsing Name

\RPC Control\mylink

\??\C:\hello.txt

Let Our Powers Combine

Page 89: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Persisting the Symlink

● Might be useful to persist the symlink between login sessions ● Can’t pass OBJ_PERMANENT directly

○ Needs SeCreatePermanentPrivilege● Get CSRSS to do it for us :-)

89

DefineDosDeviceW( DDD_NO_BROADCAST_SYSTEM | DDD_RAW_TARGET_PATH, L"GLOBALROOT\\RPC Control\\mylink", L"\\Target\\Path");

Page 90: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Combined Symbolic Link Limitations

● All existing limitations of Mount Points apply● Vulnerable application can’t try to list or inspect the mount point

itself○ Listing the directory○ Open for GetFileAttributes or similar

● Can mitigate somewhat by clever tricks with oplocks on directory hierarchy

90

Page 91: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

DEMOOne More Thing!

91

Page 92: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Links and References

● Symlink Testing Toolshttps://github.com/somwhere/symlink-testing-tools

● File Test Applicationhttps://github.com/ladislav-zezula/FileTest

92

Page 93: SyScan 2015 James Forshaw @tiraniddo Abusing ... - InfoCon 2015... · Abusing Symbolic Links on Windows James Forshaw @tiraniddo SyScan 2015 1. James Forshaw @tiraniddo Obligatory

James Forshaw @tiraniddo

Questions?

93