
명령 실행을 위한 Python 도구 상자를 게시하는 ArcGIS Enterprise 지오프로세싱 서비스입니다.
이 저장소에는 Python 도구 상자를 명령 실행 작업으로 게시하는 ArcGIS 지오프로세싱 서비스 정의가 포함되어 있습니다. 이는 승인된 보안 테스트를 위한 것입니다.
명시적인 승인을 받지 않은 시스템에서는 이 서비스를 게시하거나 사용하지 마십시오. 지오프로세싱 서비스는 ArcGIS Server 서비스 계정으로 서버 측 코드를 실행하므로, 이 프로젝트는 호스트에 대한 웹 셸과 유사한 인터페이스를 생성할 수 있습니다.
주요 산출물은 하나의 입력 매개변수를 가진 Python 도구 상자 작업인 ArcGIS_Shell입니다:
command
작업이 실행되면 서버는 운영 체제 셸을 통해 해당 명령을 실행하고 일반 콘솔 출력을 ArcGIS 작업 결과를 통해 반환합니다.
저장소에는 미리 빌드된 두 개의 ArcGIS 서비스 정의 파일이 포함되어 있습니다:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
또한 추출된 서비스 정의 폴더도 포함합니다:
ArcGIS_Shell_10.9.1_and_earlier/
ArcGIS_Shell_11_or_later/
이 폴더에는 ArcGIS가 .sd 아카이브로 패키징하는 파일들이 포함되어 있으며, 내장된 ArcGIS_Shell.pyt 파일도 여기에 해당합니다. 서비스 정의를 변경할 때는 추출된 폴더를 편집한 후 package_sd.py로 .sd 파일을 다시 빌드하십시오.
ArcGIS 서비스 정의(.sd)는 패키징된 배포 아티팩트입니다. 여기에는 서비스 메타데이터, 구성, 툴박스 또는 맵 리소스, 그리고 ArcGIS Server가 서비스를 게시하는 데 필요한 지원 파일들이 포함됩니다.
이 저장소에서 각 .sd는 ArcGIS 호환 압축 설정을 사용하는 7-Zip 아카이브입니다:
-ms=off
-m0=LZMA:d=14
두 서비스 정의 폴더는 주로 ArcGIS 패키징 버전에 따라 다릅니다:
10.9.1 and earlier: p20 paths, offlineSDVersion10x, ArcGIS 2.9 schema
11 or later: p30 paths, offlineSDVersion11, ArcGIS 3.1 schema
내장된 Python 도구 상자 로직은 두 경우 모두 동일합니다.
ArcGIS 지오프로세싱 서비스는 일반적으로 GIS 분석 워크플로를 HTTP를 통해 노출하는 데 사용됩니다. 일반적인 워크플로는 다음과 같습니다:
정당한 예로는 피처 클리핑, 네트워크 분석 실행, 래스터 처리, 보고서 생성, 일괄 GIS 변환 수행 등이 있습니다.
중요한 보안 속성은 지오프로세싱 작업이 서버 측 Python을 실행한다는 점입니다. 게시된 작업이 사용자 제어 입력을 받아 subprocess.run(..., shell=True)와 같은 위험한 기본 요소로 전달하면, 해당 지오프로세싱 작업은 명령 실행 인터페이스가 됩니다. 이것이 바로 이 프로젝트가 보여주는 내용입니다.
Shell 작업은 command라는 이름의 문자열 매개변수를 받습니다. Python 도구 상자는 ArcGIS Server 호스트에서 해당 명령을 실행하고 작업 결과에 stdout/stderr를 반환합니다.
이는 ArcGIS 지오프로세싱 서비스를 게시하거나 관리할 권한이 있는 운영자가 정상적인 ArcGIS 기능을 통해 웹 셸과 유사한 서비스를 만들 수 있음을 의미합니다. 명령은 ArcGIS Server 프로세스 계정의 보안 컨텍스트에서 실행됩니다.
이 서비스는 또한 ArcGIS Uploads 기능을 활성화합니다. 이는 서비스 업로드 엔드포인트를 노출합니다:
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
ArcGIS Server는 업로드를 사이트 시스템 디렉터리에 저장하며, 일반적으로 다음과 같은 경로 아래에 저장합니다:
<arcgisserver>/directories/arcgissystem/arcgisuploads/<itemID>
정확한 경로는 ArcGIS Server 디렉터리 구성에 따라 달라집니다. 관리자는 다음을 통해 업로드된 항목을 확인할 수 있습니다:
https://<server>/arcgis/admin/uploads?f=pjson
arcgissystem 내의 파일을 수동으로 수정하거나 삭제하지 마십시오. REST 또는 Administrator Directory를 통해 업로드 항목을 삭제하십시오.
대상 ArcGIS 버전에 맞는 .sd 파일을 사용하십시오:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
일반적인 Server Manager 흐름:
ArcGIS Server Manager 열기:
https://<server>/arcgis/manager
서비스를 게시할 권한이 있는 계정으로 로그인합니다. 일반적으로 portaladmin이 포함됩니다.
Services로 이동합니다.
Publish Service를 클릭합니다.
ArcGIS 버전에 맞는 .sd 파일을 업로드합니다. Next를 클릭합니다.
"Specify properties for your new service" 페이지에서 원하는 경우 서비스 이름을 수정합니다. Next를 클릭합니다.
"Share your services with" 페이지에서는 어떤 체크박스도 선택할 필요가 없습니다. Publish를 클릭합니다.
서비스가 자동으로 시작됩니다. 서비스 이름을 클릭한 다음 Capabilities, 그다음 REST URL을 클릭합니다.
서비스를 삭제하려면 서비스 이름 옆의 "X"를 클릭합니다.
미리 빌드된 .sd 파일에는 이미 다음이 포함되어 있습니다:
"capabilities": "Uploads"
또한 테스트를 위한 광범위한 업로드 설정도 포함되어 있습니다:
"maxUploadFileSize": "2048",
"allowedUploadFileTypes": "<broad explicit extension list>"
maxUploadFileSize는 MB 단위입니다. 확장자 목록은 평가 작업을 위해 의도적으로 폭넓게 설정되어 있지만, 여전히 명시적인 허용 목록이며 진정한 "모든 것을 허용"하는 와일드카드는 아닙니다.
게시한 후 ArcGIS REST Services Directory에서 서비스를 엽니다:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer
서비스가 폴더 안에 게시된 경우 폴더 이름을 포함하세요:
https://<server>/arcgis/rest/services/<folder>/ArcGIS_Shell/GPServer
작업을 엽니다:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/Shell
Execute Task를 클릭합니다.
명령을 설정하고 양식을 제출합니다. 작업 결과에는 명령 출력이 포함되어야 합니다.
출력은 JSON 형식이므로 줄바꿈이 이스케이프됩니다(\r\n). 여러 줄 출력은 후처리가 필요합니다.
작업이 운영 체제 셸을 사용하므로 셸 내장 명령이 작동합니다:
dir
echo test
whoami /groups
Linux 대상에서는 Linux 명령을 사용하십시오:
id
uname -a
pwd
업로드 리소스를 엽니다:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
Upload Item을 클릭하거나, 다음으로 직접 이동하세요:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
REST 웹 GUI는 업로드가 활성화된 경우 파일 선택기를 표시해야 합니다.
폼을 사용하여 파일을 선택하고 업로드를 제출하세요. 응답에는 itemID가 포함됩니다.
다음 명령으로 업로드된 항목을 검사하세요:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>
업로드한 항목을 다음 명령으로 삭제합니다:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>/delete
해당 페이지의 REST 웹 양식을 사용하여 삭제 작업을 제출하세요.
업로드된 파일은 ArcGIS Server 시스템 디렉터리 정리 정책의 적용도 받습니다. 기본 시스템 디렉터리 정리 기간은 일반적으로 24시간이지만, 관리자가 이를 변경할 수 있습니다.
ArcGIS는 서비스 업로드를 서비스 폴더나 .sd 패키지 내부가 아닌 ArcGIS Server 사이트 시스템 디렉터리에 저장합니다. 일반적인 위치는 다음과 같습니다:
<server-directories-root>/arcgissystem/arcgisuploads/<itemID>/
일반적인 Windows 레이아웃:
C:\arcgisserver\directories\arcgissystem\arcgisuploads\<itemID>\
일반적인 Linux 레이아웃:
/arcgis/server/usr/directories/arcgissystem/arcgisuploads/<itemID>/
이것들은 예시일 뿐입니다. 정확한 경로는 ArcGIS Server 사이트 디렉터리가 어떻게 구성되었는지에 따라 달라집니다.
정확한 디스크 경로를 찾으려면 Administrator Directory를 여십시오:
https://<server>/arcgis/admin/uploads?f=pjson
업로드된 항목의 itemID를 찾으세요. 해당 항목에는 다음과 유사한 필드가 포함되어야 합니다:
{
"itemID": "if4582d33-f10a-41fe-85bc-cf2e2880c46e",
"itemName": "authorized_test_binary.exe",
"pathOnServer": "c:\\arcgisserver\\directories\\arcgissystem\\arcgisuploads\\if4582d33-f10a-41fe-85bc-cf2e2880c46e",
"committed": true
}
pathOnServer는 업로드 항목 디렉터리입니다. 업로드된 파일은 일반적으로 itemName을 사용하여 해당 디렉터리 안에 위치하므로, 전체 파일 경로는 보통 다음과 같습니다:
<pathOnServer>\<itemName>
위의 예시의 경우:
C:\arcgisserver\directories\arcgissystem\arcgisuploads\if4582d33-f10a-41fe-85bc-cf2e2880c46e\authorized_test_binary.exe
Linux에서:
/arcgis/server/usr/directories/arcgissystem/arcgisuploads/if4582d33-f10a-41fe-85bc-cf2e2880c46e/authorized_test_binary
권한이 부여된 침투 테스트에서 평가 바이너리를 업로드한 뒤 Shell 작업이 해당 바이너리와 상호작용하도록 하려면 이 경로가 필요합니다. 먼저 itemID를 식별한 다음 Administrator Directory에서 pathOnServer를 가져온 후, 이를 itemName과 결합하십시오. 정확한 파일 이름이 불분명한 경우, 아무것도 실행하기 전에 Shell 작업을 사용하여 업로드 항목 디렉터리를 나열하십시오:
dir "C:\arcgisserver\directories\arcgissystem\arcgisuploads\<itemID>"
또는 Linux에서:
ls -la "/arcgis/server/usr/directories/arcgissystem/arcgisuploads/<itemID>"
arcgissystem에서 파일을 수동으로 삭제하지 마십시오. ArcGIS가 업로드 메타데이터의 일관성을 유지할 수 있도록 서비스 업로드 삭제 페이지나 Administrator Directory를 사용하십시오.
7-Zip을 설치하십시오.
Windows:
winget install 7zip.7zip
Kali/Debian:
sudo apt update
sudo apt install p7zip-full
두 .sd 파일을 다시 빌드합니다:
python3 package_sd.py ArcGIS_Shell_10.9.1_and_earlier
python3 package_sd.py ArcGIS_Shell_11_or_later
Windows에서:
python .\package_sd.py .\ArcGIS_Shell_10.9.1_and_earlier
python .\package_sd.py .\ArcGIS_Shell_11_or_later
7-Zip이 PATH에 없으면 명시적으로 전달하세요:
python3 package_sd.py ArcGIS_Shell_11_or_later --seven-zip /usr/bin/7z
패키저는 추출된 폴더의 내용을 .sd 루트에 아카이브합니다. 폴더 자체는 포함하지 않습니다.
ArcGIS_Shell.pyt
package_sd.py
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
ArcGIS_Shell_10.9.1_and_earlier/
ArcGIS_Shell_11_or_later/
.sd 파일은 게시하는 대상입니다. 추출된 폴더는 필요할 경우 package_sd.py로 편집하고 다시 패키징하는 대상입니다. ArcGIS_Shell.pyt는 .sd 파일과 추출된 폴더에 포함되어 있으며, 검토 편의를 위해 저장소 루트에만 존재합니다.