| | at : |
Archive

[POWERSHELL] 파워쉘을 이용한 파일 정보 확인하기(Write a get file information script) 하훌 rwxr-xr-x 0 8/24/2017



[POWERSHELL] 파워쉘을 이용한 파일 정보 확인하기(Write a get file information script)

Permission rw-r--r--
Author 하훌
Date and Time 8/24/2017
Label
License 크리에이티브 커먼즈 라이선스



파워쉘에 대한 이야기를 잠깐 할까합니다. 윈도우 환경에서 파워쉘 사용 시 batch 파일에 비해 상세하게 시스템에 대해 제어할 수 있고 Ruby, Python 과 같은 언어와 달리 기본적으로 내장되어 있기 때문에 별도의 설치 없이 사용할 수 있는 장점이 있습니다.

오늘은 파워쉘을 이용해서 파일에 대한 정보를 가져오고, 내용을 보는 방법에 대해 정리하고 이를 통해 간단하게 파일 정보에 대해 확인하는 스크립트를 만들어보도록 하죠.

Get File information 

get-itemproperty 를 사용하면 쉽게 파일에 대한 정보를 가져올 수 있습니다. .py 파일에 대해 가져와보면..

기본적인 정보부터, 생성,수정일 등등 여러가지 정보를 획득할 수 있습니다.

PS C:\>get-itemproperty -Path app.py | Format-list -Property * -Force

PSPath            : Microsoft.PowerShell.Core\FileSystem::C:\Users\Administrator\Desktop\app.py
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::C:\Users\Administrator\Desktop
PSChildName       : app.py
PSDrive           : C
PSProvider        : Microsoft.PowerShell.Core\FileSystem
VersionInfo       : File:             C:\Users\Administrator\Desktop\app.py
                    InternalName:
                    OriginalFilename:
                    FileVersion:
                    FileDescription:
                    Product:
                    ProductVersion:
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:

BaseName          : app
Mode              : -a---
Name              : app.py
Length            : 831
DirectoryName     : C:\Users\Administrator\Desktop
Directory         : C:\Users\Administrator\Desktop
IsReadOnly        : False
Exists            : True
FullName          : C:\Users\Administrator\Desktop\app.py
Extension         : .py
CreationTime      : 2017-05-15 오후 12:01:18
CreationTimeUtc   : 2017-05-15 오전 3:01:18
LastAccessTime    : 2017-05-15 오후 12:01:16
LastAccessTimeUtc : 2017-05-15 오전 3:01:16
LastWriteTime     : 2017-05-15 오후 1:37:44
LastWriteTimeUtc  : 2017-05-15 오전 4:37:44
Attributes        : Archive

뒤에 Format-list -Property * -Force 부분은 데이터를 조금 더 좋게 표현하기 위해 파이프로 넘겨 출력 형태를 변경한 것입니다. 파워쉘은 각각 출력 데이터가 Object 처럼 지정되어 있기 때문에 출력 형태를 변형하거나 필요한 데이터를 읽기 매우 쉽습니다.

Get Binary information

get-content를 이용하면 파일 내용을 읽을 수 있습니다.

PS C:\>get-content "File" 

형태로 넘겨주면 파일에 따라 알수없는 값이 나타나기도 합니다. 당연히.. txt 같이 plan text가 들어있다면 잘 보이겠지만 실행 파일처럼 바이너리들은 깨진 문자를 만나게 되죠. 그래서 우린 -Encoding 인자를 넘겨주어 표현할 인코딩을 지정해줍니다. UTF8, Byte 등이 많이 쓰이죠.

get-content "Path" -Encoding UTF8 | Select-Object -First 50
get-content "Path" -Encoding Byte | Select-Object -First 50
get-content "Path" | Select-Object -First 50

get-content 이외에도 OpenRead()를 통해 파일 데이터를 읽어올 수 있습니다. 편의에 따라 사용하시면 좋을 것 같네요. 아래는 파일을 읽어 Byte로 출력해주는 스크립트 코드입니다. [System.IO.File]::OpenRead()로 대상 파일을 읽은 후 내부 데이터를 Byte 형태로 출력해줍니다.

$bufferSize = 65536
$stream = [System.IO.File]::OpenRead("File Path")
while ( $stream.Position -lt $stream.Length ) {
#BEGIN CALLOUT A
  $buffer = new-object Byte[] $bufferSize
  $bytesRead = $stream.Read($buffer, 0, $bufferSize)
#END CALLOUT A
  for ( $line = 0; $line -lt [Math]::Floor($bytesRead /
  16); $line++ ) {
    $slice = $buffer[($line * 16)..(($line * 16) + 15)]
    (("{0:X2} {1:X2} {2:X2} {3:X2} {4:X2} {5:X2} ") +
    ("{6:X2} {7:X2} {8:X2} {9:X2} {10:X2} {11:X2} ") +
    ("{12:X2} {13:X2} {14:X2} {15:X2} ")) -f $slice
  }
#BEGIN CALLOUT B
  if ( $bytesRead % 16 -ne 0 ) {
    $slice = $buffer[($line * 16)..($bytesRead - 1)]
    $output = ""
    foreach ( $byte in $slice ) {
      $output += "{0:X2} " -f $byte
    }
    $output
#END CALLOUT B
  }
}
$stream.Close()

Get file information script

위 2가지를 조합해보면 파일에 대한 정보를 불러오는 스크립트를 만들 수 있습니다. 사실 다른 수집 코드도 내용만 붙여가면 더 좋은 스크립트가 될거라 생각합니다.

finfo.ps1
Param (
[Parameter(Mandatory=$true)] // 파일 이름을 꼭 받도록 Mandatory 지정
$path
)

Write-Host " ---- < File Default Information > "
get-itemproperty -Path $path | Format-list -Property * -Force
Write-Host " ---- < Binary Hex Data > "
$bufferSize = 65536
$stream = [System.IO.File]::OpenRead($path)
while ( $stream.Position -lt $stream.Length ) {
#BEGIN CALLOUT A
  $buffer = new-object Byte[] $bufferSize
  $bytesRead = $stream.Read($buffer, 0, $bufferSize)
#END CALLOUT A
  for ( $line = 0; $line -lt [Math]::Floor($bytesRead /
  16); $line++ ) {
    $slice = $buffer[($line * 16)..(($line * 16) + 15)]
    (("{0:X2} {1:X2} {2:X2} {3:X2} {4:X2} {5:X2} ") +
    ("{6:X2} {7:X2} {8:X2} {9:X2} {10:X2} {11:X2} ") +
    ("{12:X2} {13:X2} {14:X2} {15:X2} ")) -f $slice
  }
#BEGIN CALLOUT B
  if ( $bytesRead % 16 -ne 0 ) {
    $slice = $buffer[($line * 16)..($bytesRead - 1)]
    $output = ""
    foreach ( $byte in $slice ) {
      $output += "{0:X2} " -f $byte
    }
    $output
#END CALLOUT B
  }
}
$stream.Close()

실행해보면..

PS C:\> .\finfo.ps1 .\app.py
 ---- < File Default Information >


PSPath            : Microsoft.PowerShell.Core\FileSystem::C:\Users\Administrator\Desktop\app.py
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::C:\Users\Administrator\Desktop
PSChildName       : app.py
PSDrive           : C
PSProvider        : Microsoft.PowerShell.Core\FileSystem
VersionInfo       : File:             C:\Users\Administrator\Desktop\app.py
                    InternalName:
                    OriginalFilename:
                    FileVersion:
                    FileDescription:
                    Product:
                    ProductVersion:
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:

BaseName          : app
Mode              : -a---
Name              : app.py
Length            : 831
DirectoryName     : C:\Users\Administrator\Desktop
Directory         : C:\Users\Administrator\Desktop
IsReadOnly        : False
Exists            : True
FullName          : C:\Users\Administrator\Desktop\app.py
Extension         : .py
CreationTime      : 2017-05-15 오후 12:01:18
CreationTimeUtc   : 2017-05-15 오전 3:01:18
LastAccessTime    : 2017-05-15 오후 12:01:16
LastAccessTimeUtc : 2017-05-15 오전 3:01:16
LastWriteTime     : 2017-05-15 오후 1:37:44
LastWriteTimeUtc  : 2017-05-15 오전 4:37:44
Attributes        : Archive



 ---- < Binary Hex Data >
69 6D 70 6F 72 74 20 74 68 72 65 61 64 69 6E 67
0A 69 6D 70 6F 72 74 20 73 75 62 70 72 6F 63 65
73 73 0A 69 6D 70 6F 72 74 20 6F 73 0A 69 6D 70
6F 72 74 20 73 79 73 0A 69 6D 70 6F 72 74 20 67
6C 6F 62 0A 0A 64 65 66 20 72 75 6E 54 68 72 65
61 64 28 71 75 65 72 79 29 3A 0A 09 66 6F 72 20
69 20 69 6E 20 72 61 6E 67 65 28 61 70 70 4C 69
73 74 43 6F 75 6E 74 29 3A 0A 09 09 70 72 69 6E
74 20 71 75 65 72 79 2B 61 70 70 4C 69 73 74 5B
69 5D 0A 09 09 23 6F 73 2E 73 79 73 74 65 6D 28
71 75 65 72 79 29 0A 09 0A 74 68 72 65 61 64 73
20 3D 20 5B 5D 0A 63 62 65 20 3D 20 22 61 64 62
20 2D 73 20 22 0A 63 61 66 20 3D 20 22 20 69 6E
73 74 61 6C 6C 20 22 0A 71 75 65 72 79 20 3D 5B
5D 0A 23 61 70 70 6E 61 6D 65 20 3D 20 73 79 73
2E 61 72 67 76 5B 31 5D 0A 0A 61 70 70 4C 69 73
74 20 3D 20 67 6C 6F 62 2E 67 6C 6F 62 28 22 2E
.....

여기에 파워쉘 Refernce를 참조하며 필요한 데이터 수집 부분을 더한다면 윈도우에서 사용할 수 있는 아주 편리한 파일 분석 스크립트로 만들수도 있을 것 같습니다.

상세한  Function 에 대한 정보는 MSDN 찾아보시면 잘 나옵니다.
https://msdn.microsoft.com/en-us/library/ms714469(v=vs.85).aspx

Reference

http://windowsitpro.com/powershell/get-hex-dumps-files-powershell
https://msdn.microsoft.com/en-us/library/ms714469(v=vs.85).aspx

Share







HAHWUL
HACKING | PENETRATION-TEST | CODING
HACKERONE : GIT : 0DAY-TODAY : EXPLOIT-DB : PACKETSTORM
GOOGLE+ | HAHWUL@GMAIL.COM | TWITTER
WWW.HAHWUL.COM




0 개의 댓글:

댓글 쓰기