دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
دانشنامه مارال هاست دانشنامه مارال هاست
دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
امنیت
  • Folder icon closed Folder open iconCIA Triad چیست؟ آشنایی با سه اصل اساسی امنیت اطلاعات
  • Folder icon closed Folder open iconAttack Surface چیست؟ آشنایی با سطح حمله در امنیت سایبری
  • Folder icon closed Folder open iconThreat چیست؟ آشنایی با مفهوم تهدید در امنیت سایبری
  • Folder icon closed Folder open iconVulnerability چیست؟ آشنایی با آسیب‌پذیری در امنیت سایبری
  • Folder icon closed Folder open iconExploit چیست؟ آشنایی با مفهوم اکسپلویت در امنیت سایبری
  • Folder icon closed Folder open iconRisk چیست؟ آشنایی با مفهوم ریسک در امنیت سایبری
  • Folder icon closed Folder open iconCVE چیست؟ آشنایی با سیستم شماره‌گذاری آسیب‌پذیری‌های امنیتی
  • Folder icon closed Folder open iconCVSS چیست؟ آشنایی با سیستم امتیازدهی آسیب‌پذیری‌های امنیتی
  • Folder icon closed Folder open iconبعد از خرید سرور مجازی لینوکس(VPS)، اولین کارهایی که باید انجام دهید
  • Folder icon closed Folder open iconآموزش تغییر Hostname سرور در لینوکس
  • Folder icon closed Folder open iconآموزش تنظیم صحیح Timezone و NTP در لینوکس
  • Folder icon closed Folder open iconآموزش بروزرسانی کامل سیستم‌عامل لینوکس همه توزیع ها
  • Folder icon closed Folder open iconآموزش ساخت کاربر جدید و حذف استفاده روزمره از Root در لینوکس
  • Folder icon closed Folder open iconآموزش تنظیم صحیح sudo در لینوکس
  • Folder icon closed Folder open iconآموزش تنظیم Banner ورود به SSH در لینوکس
  • Folder icon closed Folder open iconآموزش مدیریت Password Policy در لینوکس
  • Folder icon closed Folder open iconآموزش نصب و راه‌اندازی SSH Key Authentication در لینوکس
  • Folder icon closed Folder open iconآموزش غیرفعال کردن ورود مستقیم Root از طریق SSH
  • Folder icon closed Folder open iconتغییر پورت SSH؛ آیا واقعاً امنیت سرور را افزایش می‌دهد؟
  • Folder icon closed Folder open iconآموزش محدود کردن کاربران مجاز SSH در لینوکس
  • Folder icon closed Folder open iconآموزش محدود کردن دسترسی SSH بر اساس IP در لینوکس
  • Folder icon closed Folder open iconآموزش تنظیم LoginGraceTime در SSH؛ کاهش زمان انتظار برای احراز هویت
  • Folder icon closed Folder open iconآموزش تنظیم MaxAuthTries در SSH؛ محدود کردن تعداد تلاش‌های ورود ناموفق
  • Folder icon closed Folder open iconآموزش بررسی لاگ‌های SSH در لینوکس
  • Folder icon closed Folder open iconآموزش عیب‌یابی مشکلات SSH در لینوکس
  • Folder icon closed Folder open iconآموزش کامل UFW در لینوکس؛ راه‌اندازی، مدیریت و ایمن‌سازی فایروال سرور
  • Folder icon closed Folder open iconnftables چیست؟ آشنایی با فایروال نسل جدید لینوکس و جایگزین iptables
  • Folder icon closed Folder open iconآموزش کامل Firewalld در لینوکس
  • Folder icon closed Folder open iconآموزش کامل ConfigServer Security & Firewall (CSF)
  • Folder icon closed Folder open iconآموزش مشاهده Loginهای اخیر در لینوکس
  • Folder icon closed Folder open iconآموزش بررسی پردازش‌های مشکوک در لینوکس
  • Folder icon closed Folder open iconآموزش بررسی Cron Jobهای مشکوک در لینوکس
  • Folder icon closed Folder open iconآموزش کامل Fail2Ban در لینوکس؛ نصب و راه‌اندازی
  • Folder icon closed Folder open iconآموزش نصب RKHunter در لینوکس
  • Folder icon closed Folder open iconآموزش نصب Chkrootkit در لینوکس
  • Folder icon closed Folder open iconآموزش اسکن سرور با RKHunter و Chkrootkit
  • Folder icon closed Folder open iconآموزش نصب، پیکربندی و اسکن سرور با AIDE در لینوکس
  • Folder icon closed Folder open iconآموزش نصب، پیکربندی و استفاده از Auditd در لینوکس
  • Folder icon closed Folder open iconآموزش نصب، اسکن و تحلیل امنیت سرور با Lynis در لینوکس
  • Folder icon closed Folder open iconآموزش نصب، بروزرسانی و اسکن سرور با ClamAV در لینوکس
  • Folder icon closed Folder open iconآموزش Hardening وب‌سرور Nginx
  • Folder icon closed Folder open iconآموزش Hardening وب‌سرور Apache
  • Folder icon closed Folder open iconآموزش Hardening PHP
  • Folder icon closed Folder open iconآموزش Hardening پایگاه داده MySQL
  • Folder icon closed Folder open iconآموزش Hardening سرویس Redis
  • Folder icon closed Folder open iconآموزش Hardening سرویس Docker
  • Folder icon closed Folder open iconآموزش Hardening سرویس FTP
  • Folder icon closed Folder open iconشناسایی Backdoor و ارتباطات مخفی در سرور لینوکس
  • Folder icon closed Folder open iconاسکن آسیب‌پذیری با Nmap NSE
  • Folder icon closed Folder open iconآموزش Socat
  • Folder icon closed Folder open iconآموزش WhatWeb در لینوکس
  • Folder icon closed Folder open iconشناسایی تکنولوژی سایت‌ها
  • Folder icon closed Folder open iconآموزش Amass برای کشف Subdomain
  • Folder icon closed Folder open iconشناسایی Reverse Shell در لینوکس
  • Folder icon closed Folder open iconپیدا کردن فایل‌های SUID مشکوک
  • Folder icon closed Folder open iconبررسی کاربران Administrator مخفی در ویندوز
  • Folder icon closed Folder open iconبررسی PowerShell History
  • Folder icon closed Folder open iconشناسایی Reverse Shell در ویندوز
امنیت

بررسی PowerShell History

بررسی PowerShell History

مقدمه

PowerShell یکی از مهم‌ترین ابزارهای مدیریت Windows و Windows Server است.

مدیران سیستم از PowerShell برای کارهایی مانند:

  • مدیریت کاربران
  • تنظیم Firewall
  • مدیریت Serviceها
  • نصب نرم‌افزار
  • مدیریت IIS
  • بررسی Network
  • مدیریت Active Directory
  • اجرای Scriptهای مدیریتی

استفاده می‌کنند.

اما همین قابلیت‌ها باعث شده PowerShell در بررسی رخدادهای امنیتی نیز اهمیت زیادی داشته باشد.

اگر روی یک Windows Server فعالیت مشکوکی مشاهده شود، یکی از سؤالات مهم این است:

چه Commandهایی با PowerShell روی Server اجرا شده‌اند؟

PowerShell چند مکانیزم متفاوت برای نگهداری History و Log دارد و صرف اجرای:

Get-History

تصویر کاملی از فعالیت‌های گذشته ارائه نمی‌کند.

در این مقاله روش بررسی PowerShell History، فایل PSReadLine، History سایر کاربران، Event Logها، Script Block Logging و Transcriptها را بررسی می‌کنیم.


PowerShell History چیست؟

PowerShell در واقع دو نوع اصلی History دارد:

Session History

و:

PSReadLine History

این دو مستقل از یکدیگر هستند. Microsoft نیز در مستندات رسمی PowerShell این دو History Provider را جدا از یکدیگر معرفی می‌کند.

تفاوت آنها اهمیت زیادی دارد.


Session History چیست؟

Session History مربوط به همان PowerShell Session فعلی است.

برای مشاهده آن:

Get-History

می‌توان استفاده کرد.

Aliasهای آن نیز عبارت‌اند از:

history

یا:

h

Microsoft توضیح می‌دهد که Get-History فقط History مربوط به Session جاری را دریافت می‌کند.

برای مثال:

Get-History

ممکن است نتیجه‌ای مانند زیر نمایش دهد:

Id CommandLine
-- -----------
1  Get-Service
2  Get-Process
3  Get-LocalUser
4  Get-NetTCPConnection

محدودیت مهم Get-History

فرض کنید Administrator پنجره PowerShell را بسته و دوباره باز کرده باشد.

اگر اجرا کنید:

Get-History

History Session قبلی در این بخش وجود نخواهد داشت.

Session History با پایان Session از بین می‌رود و بین Sessionهای مختلف Share نمی‌شود.

بنابراین برای Incident Investigation نباید فقط به Get-History اعتماد کرد.


مشاهده جزئیات بیشتر Session History

برای نمایش تمام Propertyهای History:

Get-History | Format-List *

HistoryInfo علاوه بر Command دارای اطلاعاتی مانند زمان شروع و پایان اجرای Command نیز هست.

برای خروجی کاربردی‌تر:

Get-History |
Select-Object Id,CommandLine,ExecutionStatus,StartExecutionTime,EndExecutionTime

این خروجی برای تحلیل Commandهای Session فعلی مناسب است.


مشاهده آخرین Commandها

برای مشاهده آخرین 10 دستور:

Get-History -Count 10

برای آخرین Command:

Get-History -Count 1

PSReadLine History چیست؟

مکانیزم مهم‌تر برای بررسی Historyهای قبلی معمولاً:

PSReadLine History

است.

PSReadLine Commandهایی را که کاربر در Console وارد کرده است در یک History File نگهداری می‌کند.

برخلاف Session History، این فایل پس از بسته شدن PowerShell باقی می‌ماند و در Sessionهای بعدی نیز قابل استفاده است.

برای Incident Investigation، این فایل معمولاً بسیار مهم‌تر از Get-History است.


پیدا کردن مسیر واقعی PowerShell History

بهترین روش این نیست که مسیر را حدس بزنیم.

اجرا کنید:

(Get-PSReadLineOption).HistorySavePath

نمونه خروجی:

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

مستندات رسمی PSReadLine نیز HistorySavePath را محل ذخیره فایل History معرفی می‌کنند.


مسیر پیش‌فرض PSReadLine History در ویندوز

در Windows معمولاً History داخل مسیر زیر قرار دارد:

%APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\

و برای PowerShell Console معمولاً فایل:

ConsoleHost_history.txt

وجود دارد.

برای Administrator ممکن است مسیر کامل چنین باشد:

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

نمایش فایل PowerShell History

ابتدا مسیر را داخل Variable قرار دهید:

$HistoryFile = (Get-PSReadLineOption).HistorySavePath

سپس:

Get-Content $HistoryFile

را اجرا کنید.

ممکن است خروجی شامل Commandهای Sessionهای قبلی باشد:

Get-Service
Get-LocalUser
Restart-Service W3SVC
Get-NetTCPConnection
Get-ChildItem C:\inetpub

مشاهده آخرین دستورات ذخیره‌شده

اگر فایل History بسیار بزرگ است:

Get-Content $HistoryFile -Tail 50

فقط 50 خط آخر را نمایش می‌دهد.

برای 100 خط آخر:

Get-Content $HistoryFile -Tail 100

این روش برای بررسی سریع فعالیت‌های اخیر مناسب است.


چرا Get-History و History File نتایج متفاوتی دارند؟

فرض کنید:

Get-History

فقط 8 Command نمایش دهد.

اما:

Get-Content (Get-PSReadLineOption).HistorySavePath

هزاران Command نمایش دهد.

این رفتار طبیعی است.

زیرا:

Get-History

فقط Session جاری را بررسی می‌کند.

اما:

PSReadLine History

می‌تواند Commandهای Sessionهای قبلی را در فایل نگه دارد.


Clear-History چه چیزی را پاک می‌کند؟

یک نکته مهم در بررسی Forensics این است که:

Clear-History

روی Built-in Session History تأثیر می‌گذارد.

PSReadLine History یک سیستم جداگانه است و *-History Cmdletها مستقیماً آن را مدیریت نمی‌کنند.

بنابراین خالی بودن نتیجه:

Get-History

به این معنی نیست که هیچ Command قبلی روی سیستم اجرا نشده است.


نام History File ممکن است متفاوت باشد

PSReadLine History برای هر Host می‌تواند فایل جداگانه‌ای داشته باشد.

نام فایل به شکل:

$($Host.Name)_history.txt

ساخته می‌شود.

برای PowerShell Console معمولاً:

ConsoleHost_history.txt

است.

اما برای PowerShell داخل Visual Studio Code ممکن است چیزی مانند:

Visual Studio Code Host_history.txt

وجود داشته باشد.

به همین دلیل در Investigation بهتر است تمام فایل‌های Directory مربوط به PSReadLine بررسی شوند.


مشاهده تمام History Fileهای کاربر

اجرا کنید:

$HistoryDir = Split-Path (Get-PSReadLineOption).HistorySavePath

Get-ChildItem $HistoryDir

ممکن است چند فایل مشاهده شود:

ConsoleHost_history.txt
Visual Studio Code Host_history.txt

هر کدام باید جداگانه بررسی شوند.


پیدا کردن History سایر کاربران ویندوز

اگر Administrator سیستم هستید و قصد بررسی Forensics دارید، می‌توانید Profileهای کاربران را بررسی کنید.

برای مثال:

Get-ChildItem `
"C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\*_history.txt" `
-ErrorAction SilentlyContinue

ممکن است نتیجه‌ای مانند زیر دریافت کنید:

C:\Users\Administrator\...\ConsoleHost_history.txt
C:\Users\SupportAdmin\...\ConsoleHost_history.txt
C:\Users\kian\...\ConsoleHost_history.txt

این موضوع در Windows Serverهایی که چند Administrator دارند بسیار کاربردی است.


بررسی History یک User خاص

فرض کنید User مشکوک:

SupportAdmin

است.

می‌توانید فایل آن را بررسی کنید:

Get-Content `
"C:\Users\SupportAdmin\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt"

در Investigation واقعی بهتر است قبل از تحلیل، Copy از فایل تهیه و Hash آن نیز ثبت شود.


ذخیره Evidence قبل از بررسی

برای مثال:

$HistoryFile = (Get-PSReadLineOption).HistorySavePath

Copy-Item $HistoryFile C:\IR\ConsoleHost_history_copy.txt

سپس Hash:

Get-FileHash C:\IR\ConsoleHost_history_copy.txt -Algorithm SHA256

این کار کمک می‌کند نسخه اولیه Evidence حفظ شود.


جستجوی Commandهای مهم داخل History

به‌جای خواندن هزاران خط، می‌توان از:

Select-String

استفاده کرد.

مثلاً برای جستجوی Commandهای مرتبط با User Management:

Select-String `
-Path $HistoryFile `
-Pattern "New-LocalUser|Add-LocalGroupMember|net user"

این بررسی می‌تواند مشخص کند آیا Account جدیدی ایجاد یا Privilege آن تغییر داده شده است.


بررسی Commandهای مرتبط با Download

برای پیدا کردن Commandهایی که ممکن است فایل دریافت کرده باشند:

Select-String `
-Path $HistoryFile `
-Pattern "Invoke-WebRequest|Start-BitsTransfer|curl|wget"

وجود این Commandها به‌تنهایی نشانه نفوذ نیست.

ممکن است Administrator کاملاً قانونی از آنها برای دانلود نرم‌افزار استفاده کرده باشد.

هدف فقط پیدا کردن نقاطی برای بررسی بیشتر است.


بررسی تغییرات Defender و Security

برای جستجوی Commandهای مرتبط با Windows Defender:

Select-String `
-Path $HistoryFile `
-Pattern "Set-MpPreference|Add-MpPreference|Remove-MpPreference"

اگر Command امنیتی مهمی پیدا شد، باید مشخص شود چه کسی و چرا آن را اجرا کرده است.


جستجوی Scheduled Task

Select-String `
-Path $HistoryFile `
-Pattern "ScheduledTask|schtasks"

اگر Incident مربوط به Persistence باشد، این قسمت اهمیت بیشتری دارد.


جستجوی Service Management

Select-String `
-Path $HistoryFile `
-Pattern "New-Service|Set-Service|Start-Service|Stop-Service|sc.exe"

به‌خصوص ایجاد Service جدید باید با Change History سیستم مقایسه شود.


جستجوی Network Commandها

برای مثال:

Select-String `
-Path $HistoryFile `
-Pattern "Test-NetConnection|Get-NetTCPConnection|netstat|Resolve-DnsName"

این دسته از Commandها ممکن است کاملاً مدیریتی باشند، اما می‌توانند Timeline فعالیت User را بهتر مشخص کنند.


جستجوی Commandهای Encode شده

یکی از مواردی که در Incident Investigation ارزش بررسی دارد اجرای PowerShell با Optionهایی مانند:

EncodedCommand

است.

برای جستجو:

Select-String `
-Path $HistoryFile `
-Pattern "EncodedCommand|-enc "

وجود چنین Commandی الزاماً مخرب نیست، اما در Serverهای Production باید دلیل مشخصی داشته باشد.


PSReadLine History Timestamp دارد؟

Session History که توسط:

Get-History

نمایش داده می‌شود، Start و End Time مربوط به همان Session را در اختیار دارد.

اما فایل متنی معمول PSReadLine اساساً برای Recall کردن Commandها طراحی شده و Timestamp مستقل هر Command را مانند یک Security Log کامل نگهداری نمی‌کند.

به همین دلیل برای ساخت Timeline دقیق نباید فقط به:

ConsoleHost_history.txt

اعتماد کرد.

برای Timeline باید Event Log، Transcript و سایر Logهای سیستم را نیز بررسی کنیم.


تنظیمات History فعلی را بررسی کنیم

اجرا کنید:

Get-PSReadLineOption |
Select-Object HistorySavePath,HistorySaveStyle,MaximumHistoryCount

نمونه:

HistorySavePath    : C:\Users\...\ConsoleHost_history.txt
HistorySaveStyle   : SaveIncrementally
MaximumHistoryCount: 4096

مستندات PSReadLine سه حالت HistorySaveStyle را معرفی می‌کنند:

SaveIncrementally
SaveAtExit
SaveNothing

و حالت پیش‌فرض معمول SaveIncrementally است.


SaveIncrementally چیست؟

در این حالت History به‌صورت تدریجی در فایل نوشته می‌شود.

بنابراین اگر PowerShell به‌صورت غیرمنتظره بسته شود، بخش زیادی از Commandهای قبلی همچنان در فایل وجود دارند.


SaveAtExit چیست؟

در این حالت History هنگام Exit شدن PowerShell در فایل نوشته می‌شود.

در Incident Investigation این تفاوت می‌تواند اهمیت داشته باشد.


SaveNothing چیست؟

اگر:

HistorySaveStyle = SaveNothing

باشد، PSReadLine از History File استفاده نمی‌کند.

بنابراین نبود فایل History همیشه به معنی نبود فعالیت PowerShell نیست.

ممکن است History Saving از ابتدا غیرفعال بوده باشد.


History می‌تواند اطلاعات حساس داشته باشد

یک نکته امنیتی مهم این است که History ممکن است شامل اطلاعات حساس واردشده توسط Administrator باشد.

PSReadLine تلاش می‌کند بعضی Commandهای حاوی اطلاعاتی مانند Password، Token، API Key یا Secret را از ذخیره شدن در فایل History فیلتر کند، اما این مکانیزم نباید به‌عنوان تضمین کامل جلوگیری از ذخیره Secret در نظر گرفته شود.

بنابراین History File باید مانند یک فایل حساس محافظت شود.


PowerShell Event Log را بررسی کنیم

History File تنها Source ما نیست.

PowerShell می‌تواند اطلاعات مهمی را در Windows Event Log نیز ثبت کند.

در Windows PowerShell 5.1 مسیر مهم:

Applications and Services Logs
    |
    Microsoft
      |
      Windows
        |
        PowerShell
          |
          Operational

است.

Microsoft تأیید می‌کند که PowerShell عملیات Engine و اجرای Commandها را در Windows Event Log ثبت می‌کند.


مشاهده PowerShell Operational Log

با PowerShell:

Get-WinEvent `
-LogName "Microsoft-Windows-PowerShell/Operational" `
-MaxEvents 100

برای نمایش ساده‌تر:

Get-WinEvent `
-LogName "Microsoft-Windows-PowerShell/Operational" `
-MaxEvents 100 |
Select-Object TimeCreated,Id,LevelDisplayName,Message

Event ID 4104 چیست؟

یکی از مهم‌ترین Eventهای PowerShell:

4104

است.

در صورت فعال بودن Script Block Logging، این Event محتوای Script Blockهای پردازش‌شده توسط PowerShell را در Operational Log ثبت می‌کند.

برای مشاهده:

Get-WinEvent `
-FilterHashtable @{
    LogName='Microsoft-Windows-PowerShell/Operational'
    Id=4104
} -MaxEvents 100

چرا Event 4104 مهم است؟

فرض کنید مهاجم یا Administrator Scriptی اجرا کرده است ولی:

ConsoleHost_history.txt

پاک شده یا Command موردنظر در آن ذخیره نشده باشد.

اگر Script Block Logging فعال بوده باشد، ممکن است Event 4104 همچنان اطلاعات ارزشمندی درباره Script اجراشده داشته باشد.

به همین دلیل در Incident Response بهتر است:

History File
+
Event Log

در کنار هم بررسی شوند.


جستجوی کلمات خاص در Event 4104

برای مثال:

Get-WinEvent `
-FilterHashtable @{
    LogName='Microsoft-Windows-PowerShell/Operational'
    Id=4104
} |
Where-Object {
    $_.Message -match 'New-LocalUser|Add-LocalGroupMember'
}

این روش برای پیدا کردن Script Blockهای مرتبط با User Management مفید است.


PowerShell 7 چه Logی دارد؟

در PowerShell 7، Event Provider مربوط به PowerShell Core است و Event Log معمولاً با نام:

PowerShellCore/Operational

استفاده می‌شود.

برای مشاهده:

Get-WinEvent `
-LogName "PowerShellCore/Operational" `
-MaxEvents 100

اگر Script Block Logging فعال باشد، Event ID 4104 در این Channel نیز اهمیت دارد.


Script Block Logging را از کجا فعال کنیم؟

در Windows PowerShell Group Policy معمولاً مسیر مربوطه:

Computer Configuration
    |
    Administrative Templates
      |
      Windows Components
        |
        Windows PowerShell
          |
          Turn on PowerShell Script Block Logging

است.

وقتی این Policy فعال باشد، PowerShell Script Input را در Operational Event Log ثبت می‌کند.

در Serverهای حساس فعال بودن این Logging برای Incident Investigation بسیار ارزشمند است.


PowerShell Transcription چیست؟

روش دفاعی دیگر:

PowerShell Transcription

است.

Transcription می‌تواند Input و Output یک PowerShell Session را داخل فایل Text ذخیره کند.

این موضوع با History متفاوت است.

History معمولاً Command را ذخیره می‌کند.

Transcript می‌تواند علاوه بر Command، Output نمایش‌داده‌شده در Console را نیز ثبت کند.


پیدا کردن PowerShell Transcriptها

اگر Transcription به‌صورت دستی و بدون OutputDirectory سفارشی استفاده شده باشد، مسیر پیش‌فرض معمولاً داخل:

$HOME\Documents

است و نام فایل شامل:

PowerShell_transcript

خواهد بود.

برای جستجو:

Get-ChildItem `
"$HOME\Documents" `
-Filter "PowerShell_transcript*" `
-Recurse `
-ErrorAction SilentlyContinue

در Environment سازمانی ممکن است OutputDirectory مرکزی دیگری توسط Group Policy تعریف شده باشد.


چرا Transcript مفید است؟

فرض کنید History فقط این Command را نشان دهد:

Get-Service

اما Transcript می‌تواند علاوه بر Command، Result نمایش‌داده‌شده را نیز ثبت کرده باشد.

در Investigation این تفاوت اهمیت زیادی دارد.

Microsoft امکان فعال‌سازی PowerShell Transcription از طریق Group Policy و ذخیره آن در Location مرکزی را نیز فراهم می‌کند.


یک Workflow عملی برای بررسی PowerShell History

فرض کنیم روی Windows Server فعالیت مشکوکی مشاهده شده است.

مرحله اول: Session History

Get-History |
Format-List *

مرحله دوم: پیدا کردن PSReadLine History

$HistoryFile = (Get-PSReadLineOption).HistorySavePath

$HistoryFile

مرحله سوم: حفظ Evidence

New-Item C:\IR -ItemType Directory -ErrorAction SilentlyContinue

Copy-Item $HistoryFile C:\IR\ConsoleHost_history.txt

مرحله چهارم: Hash

Get-FileHash `
C:\IR\ConsoleHost_history.txt `
-Algorithm SHA256

مرحله پنجم: مشاهده آخرین Commandها

Get-Content `
C:\IR\ConsoleHost_history.txt `
-Tail 100

مرحله ششم: جستجوی Commandهای حساس

Select-String `
-Path C:\IR\ConsoleHost_history.txt `
-Pattern "New-LocalUser|Add-LocalGroupMember|ScheduledTask|Set-MpPreference|Invoke-WebRequest"

مرحله هفتم: بررسی کاربران دیگر

Get-ChildItem `
"C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\*_history.txt" `
-ErrorAction SilentlyContinue

مرحله هشتم: بررسی Event 4104

Get-WinEvent `
-FilterHashtable @{
    LogName='Microsoft-Windows-PowerShell/Operational'
    Id=4104
} -MaxEvents 200

مرحله نهم: بررسی Transcript

Get-ChildItem `
C:\Users `
-Filter "PowerShell_transcript*" `
-Recurse `
-ErrorAction SilentlyContinue

اکنون چند Source مختلف برای ساخت Timeline در اختیار داریم.


محدودیت PowerShell History در Forensics

PowerShell History منبع بسیار ارزشمندی است، اما کامل نیست.

ممکن است:

  • History Saving غیرفعال باشد.
  • PSReadLine Load نشده باشد.
  • User از Host دیگری استفاده کرده باشد.
  • Command از Script اجرا شده باشد.
  • History File تغییر کرده باشد.
  • فایل حذف شده باشد.
  • فعالیت از PowerShell Remoting یا Automation انجام شده باشد.
  • بعضی Commandها به دلیل Sensitive Data Filtering در فایل ذخیره نشده باشند.

بنابراین:

نبود Command در History اثبات نمی‌کند که Command اجرا نشده است.


Commandهای داخل Script همیشه در History نیستند

فرض کنید User اجرا کند:

.\maintenance.ps1

ممکن است History فقط همین خط را نشان دهد.

اما Script داخل فایل ده‌ها Command دیگر اجرا کرده باشد.

به همین دلیل برای Investigation باید:

Script File
Script Block Logging
Event Logs
Transcript

نیز بررسی شوند.


تاریخچه را با Security Log تطبیق دهید

اگر History نشان دهد:

New-LocalUser

اجرا شده است، Windows Security Log نیز باید بررسی شود.

برای مثال ایجاد User می‌تواند با Event:

4720

ارتباط داشته باشد.

اضافه کردن User به Local Administrators نیز ممکن است Event:

4732

ایجاد کند.

این Correlation می‌تواند Timeline را قابل اعتمادتر کند.


مثال Correlation

فرض کنید History نشان دهد:

New-LocalUser
Add-LocalGroupMember

سپس Event Log را بررسی می‌کنیم:

Get-WinEvent `
-FilterHashtable @{
    LogName='Security'
    Id=4720,4732
} |
Select-Object TimeCreated,Id,Message

اگر زمان Eventها با فعالیت PowerShell هم‌خوانی داشته باشد، Evidence قوی‌تری داریم.


آیا History File به‌تنهایی Evidence قطعی است؟

خیر.

یک فایل Text می‌تواند:

  • Edit شود.
  • حذف شود.
  • Truncate شود.
  • توسط User دیگری تغییر داده شود.

بنابراین History برای Investigation بسیار مفید است، اما باید با منابع دیگر Correlate شود.

منابع مکمل عبارت‌اند از:

  • Windows Security Log
  • PowerShell Operational Log
  • Sysmon
  • EDR
  • Scheduled Task Log
  • Defender Log
  • Application Log
  • RDP Log
  • Transcript
  • File Timeline

برای Serverهای حساس چه Loggingهایی پیشنهاد می‌شود؟

حداقل موارد زیر ارزش بررسی دارند:

  • PowerShell Script Block Logging
  • PowerShell Transcription
  • Windows Security Auditing
  • Process Creation Logging
  • Sysmon یا EDR
  • Centralized Log Collection
  • SIEM

به‌خصوص ارسال Logها به سیستم دیگری اهمیت دارد، زیرا اگر Log فقط روی Server آلوده نگهداری شود ممکن است قابل دستکاری باشد.


PowerShell History را مانیتور کنیم یا Event Log؟

برای Security Monitoring، Event Log گزینه مناسب‌تری است.

History File بیشتر برای:

Investigation
Troubleshooting
User Activity Review

مناسب است.

برای Alerting و Monitoring بهتر است از:

Script Block Logging
Security Logging
EDR
SIEM

استفاده شود.


اشتباهات رایج

برخی اشتباهات متداول هنگام بررسی PowerShell History عبارت‌اند از:

  • اعتماد فقط به Get-History
  • فراموش کردن PSReadLine History
  • بررسی نکردن History سایر Userها
  • تصور اینکه History Timestamp کامل دارد
  • نادیده گرفتن Visual Studio Code History
  • بررسی نکردن Script Block Logging
  • توجه نکردن به Transcriptها
  • نتیجه‌گیری از یک Command بدون Context
  • تغییر Evidence قبل از Copy و Hash
  • تصور اینکه نبود History یعنی PowerShell استفاده نشده است
  • توجه نکردن به Sensitive History Filtering

بهترین روش‌ها

برای بررسی صحیح PowerShell Activity:

  • Session History را بررسی کنید.
  • مسیر واقعی PSReadLine History را از Configuration دریافت کنید.
  • قبل از تحلیل، Copy از History بگیرید.
  • Hash Evidence را ثبت کنید.
  • History تمام Userهای مدیریتی را بررسی کنید.
  • همه Host-specific History Fileها را بررسی کنید.
  • Commandهای مهم را با Select-String جستجو کنید.
  • Event 4104 را بررسی کنید.
  • Security Eventها را با History Correlate کنید.
  • Transcriptها را بررسی کنید.
  • برای Serverهای حساس Script Block Logging فعال کنید.
  • Logها را به SIEM یا Log Server مرکزی ارسال کنید.

چک‌لیست

هنگام بررسی PowerShell History موارد زیر را کنترل کنید:

  • Get-History بررسی شده است.
  • Start و End Timeهای Session History بررسی شده‌اند.
  • HistorySavePath مشخص شده است.
  • PSReadLine History File بررسی شده است.
  • HistorySaveStyle مشخص شده است.
  • History File قبل از تحلیل Backup شده است.
  • SHA256 فایل History ثبت شده است.
  • آخرین Commandها بررسی شده‌اند.
  • Commandهای User Management بررسی شده‌اند.
  • Commandهای Download بررسی شده‌اند.
  • Commandهای Defender بررسی شده‌اند.
  • Scheduled Task Commandها بررسی شده‌اند.
  • Service Management بررسی شده است.
  • Encoded PowerShell بررسی شده است.
  • History سایر کاربران بررسی شده است.
  • سایر Host History Fileها بررسی شده‌اند.
  • Event ID 4104 بررسی شده است.
  • PowerShell Transcriptها بررسی شده‌اند.
  • Security Eventها با History مقایسه شده‌اند.
  • محدودیت‌های History در نتیجه Investigation لحاظ شده‌اند.

مطالعات بیشتر

برای مطالعه بیشتر درباره PowerShell History و Logging می‌توانید مستندات رسمی Microsoft را بررسی کنید:

  • PowerShell about_History
    توضیح تفاوت Session History و PSReadLine History و نحوه عملکرد Command History.
    Microsoft Learn – about_History
  • Get-History
    مستندات رسمی Session History و Propertyهایی مانند زمان شروع و پایان اجرای Command.
    Microsoft Learn – Get-History
  • PSReadLine
    توضیح فایل History، مسیر ذخیره، Host-specific History و فیلتر اطلاعات حساس.
    Microsoft Learn – PSReadLine
  • Get-PSReadLineOption
    مشاهده HistorySavePath و سایر تنظیمات PSReadLine.
    Microsoft Learn – Get-PSReadLineOption
  • Set-PSReadLineOption
    مستندات HistorySaveStyle، HistorySavePath و نحوه مدیریت History.
    Microsoft Learn – Set-PSReadLineOption
  • PowerShell Logging on Windows
    مستندات رسمی Event Logging و Script Block Logging در Windows.
    Microsoft Learn – PowerShell Logging
  • PowerShell Group Policy Settings
    راهنمای Script Block Logging و PowerShell Transcription در Group Policy.
    Microsoft Learn – PowerShell Group Policy Settings
  • Start-Transcript
    مستندات PowerShell برای ذخیره Input و Output Session داخل Transcript File.
    Microsoft Learn – Start-Transcript

جمع‌بندی

PowerShell History یکی از منابع ارزشمند برای بررسی فعالیت‌های انجام‌شده روی Windows Server است، اما برای استفاده صحیح از آن ابتدا باید تفاوت بین دو نوع History را بدانیم.

دستور:

Get-History

فقط Commandهای Session فعلی را نمایش می‌دهد.

برای بررسی فعالیت Sessionهای قبلی معمولاً مهم‌ترین Source فایل PSReadLine است که مسیر واقعی آن را می‌توان با:

(Get-PSReadLineOption).HistorySavePath

پیدا کرد.

سپس:

Get-Content (Get-PSReadLineOption).HistorySavePath

Commandهای ذخیره‌شده را نمایش می‌دهد.

در Incident Investigation بهتر است فایل History قبل از بررسی Copy شده و Hash آن ثبت شود و سپس با ابزارهایی مانند:

Select-String

به دنبال Commandهای مهم بگردیم.

اما PowerShell History یک Log امنیتی کامل نیست.

ممکن است Command از Script اجرا شده باشد، History Saving غیرفعال باشد، فایل تغییر کرده باشد یا بعضی Commandها در History File ذخیره نشده باشند.

به همین دلیل برای بررسی جدی باید History با:

PowerShell Operational Log
Event ID 4104
Windows Security Log
PowerShell Transcript
EDR / Sysmon

مقایسه شود.

در محیط‌های Production بهتر است Script Block Logging و PowerShell Transcription از قبل فعال باشند تا در صورت بروز Incident بتوان Timeline دقیق‌تری از فعالیت‌های PowerShell ایجاد کرد.

PowerShell History سرنخ بسیار خوبی است، اما نتیجه معتبر زمانی به دست می‌آید که History با سایر Evidenceهای سیستم تطبیق داده شود.

کیان پور

هنوز نیاز به کمک دارید؟

آیا سوالی دارید؟

آیا این مقاله برای شما مفید بود؟ بله خیر

نظرات خود را بنویسید... لغو پاسخ

اشتراک گذاری این مقاله

بررسی PowerShell History

کپی کردن لینک

Clipboard Icon

جدیدترین مقالات

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی ...
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

تقویم

سپتامبر 2026
شیدسچپج
 1234
567891011
12131415161718
19202122232425
2627282930 
« جولای    

عضویت

جدیدترین پست‌ها

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی Ubuntu 24.04
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

سلام