Ruby l oop переопределяет значения - PullRequest
0 голосов
/ 20 января 2020

У меня есть этот файл с 2-мя паролями, которые мне нужны, чтобы извлечь их и ввести в файл XML:

root@nirvana:~# cat old/pwdump.txt 
# Metasploit PWDump Export 2.0
# Generated: 2020-01-12 18:43:53 UTC
# Project: default
#
#########################################################






#  Plaintext Passwords (3 passwords, 2 services)

# 192.168.0.112:22/tcp (ssh)
paulo secret1

# 192.168.0.112:22/tcp (ssh)
paulosgf secret2

Для этого я создал этот код, который сначала проверяет, существует ли поле "ssh_login". Если это так, он обновляет имя пользователя и создает поле пароля с вашим соответствующим значением. Если нет, он создает оба поля с этими значениями. Но я думаю, что этот подход неправильный:

target='192.168.0.112'

File.open("/root/old/pwdump.txt", "r") do |fd|
while(credentials = fd.gets) != nil
        if (credentials =~ /[Ss][Ss][Hh]/)
                while(credentials = fd.gets) != nil
                ssharray = "#{credentials}".to_s.split(/ /)
                sshu=ssharray.slice(0).to_s
                sshp=ssharray.slice(1).to_s.chomp
        break if credentials.include?("\n") 
        end                         
        if `xmlstarlet sel -t  -v "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/module" "/root/#{target}.xml"`
                `xmlstarlet ed -L -i "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/module" -t elem -n password -v "#{sshp}" "/root/#{target}.xml"`
                `xmlstarlet ed -L -u "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/username" -v "#{sshu}" "/root/#{target}.xml"`
        else
            `xmlstarlet ed -L -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts" -t elem -n "vuln_attempt" -v "" -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[last()]" -t elem -n "module" -v "auxiliary/scanner/ssh/ssh_login" "/root/#{target}.xml"`
            `xmlstarlet ed -L -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']" -t elem -n username -v "#{sshu}" "/root/#{target}.xml"`
            `xmlstarlet ed -L -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']" -t elem -n password -v "#{sshp}" "/root/#{target}.xml"`
        end  
        end
    end
end

После запуска кода XML значения переопределяются, с последними учетными данными, и поле пароля вставляется 2 раза:

            <vuln_attempt>
              <id>101</id>
              <vuln-id>72</vuln-id>
              <attempted-at>2020-01-18 16:25:22 UTC</attempted-at>
              <exploited>true</exploited>
              <fail-reason/>
              <username>paulosgf</username>
              <password>secret2</password>
              <password>secret2</password>
              <module>auxiliary/scanner/ssh/ssh_login</module>
              <session-id>100</session-id>
              <loot-id/>
              <fail-detail/>
            </vuln_attempt>
            <vuln_attempt>
              <id>102</id>
              <vuln-id>72</vuln-id>
              <attempted-at>2020-01-18 16:26:18 UTC</attempted-at>
              <exploited>true</exploited>
              <fail-reason/>
              <username>paulosgf</username>
              <password>secret2</password>
              <password>secret2</password>
              <module>auxiliary/scanner/ssh/ssh_login</module>
              <session-id>101</session-id>
              <loot-id/>
              <fail-detail/>
            </vuln_attempt>

если я правильно закрою оператор while(credentials = fd.gets) != nil, после команд код не изменит XML:

File.open("/root/old/pwdump.txt", "r") do |fd|
while(credentials = fd.gets) != nil
        if (credentials =~ /[Ss][Ss][Hh]/)
                while(credentials = fd.gets) != nil
                ssharray = "#{credentials}".to_s.split(/ /)
                sshu=ssharray.slice(0).to_s
                sshp=ssharray.slice(1).to_s.chomp
        break if credentials.include?("\n")                         
        if `xmlstarlet sel -t  -v "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/module" "/root/#{target}.xml"`
                `xmlstarlet ed -L -i "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/module" -t elem -n password -v "#{sshp}" "/root/#{target}.xml"`
                `xmlstarlet ed -L -u "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/username" -v "#{sshu}" "/root/#{target}.xml"`
        else
            `xmlstarlet ed -L -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts" -t elem -n "vuln_attempt" -v "" -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[last()]" -t elem -n "module" -v "auxiliary/scanner/ssh/ssh_login" "/root/#{target}.xml"`
            `xmlstarlet ed -L -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']" -t elem -n username -v "#{sshu}" "/root/#{target}.xml"`
            `xmlstarlet ed -L -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']" -t elem -n password -v "#{sshp}" "/root/#{target}.xml"`
        end  
        end
        end 
    end
end

Что не так?

1 Ответ

0 голосов
/ 28 февраля 2020

Я решил этот вопрос самостоятельно:

# This function inserts any passwords found on brute force scans into report. For this, install xmlstarlet tool
def bruteforce(target)
run_single("db_export -f pwdump -a /root/pwdump.txt")
target="#{target}".chomp

sshuser = []
sshpass = []
credssh=nil
credmys=nil
hassh = Hash.new
hamys = Hash.new

count=0
nextline=0

File.open("/root/pwdump.txt").each_line do |line|
nextline += 1
        if (line =~ /[Ss][Ss][Hh]/)
            hassh["credssh#{count}"] = nextline
            count = count + 1
    end
end

file = IO.readlines("./pwdump.txt")

if (! hassh.empty?)
hassh.each do |key, value|
    file[value].split.each_with_index do |wrd, idx| 
        if ((idx) % 2 == 0)
            sshuser.push("#{wrd}")
        else
            sshpass.push("#{wrd}")
        end 
    end
end

`xmlstarlet sel -t  -v "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']/module" "/root/#{target}.xml"`
if ($?.exitstatus == 0)
i=0
j=1
loop do
`xmlstarlet ed -L -i "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']["#{j}"]/module" -t elem -n password -v "#{sshpass[i]}" "/root/#{target}.xml"`
`xmlstarlet ed -L -u "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']["#{j}"]/username"  -v "#{sshuser[i]}" "/root/#{target}.xml"`
    i += 1
    j += 1
        if (i == sshuser.length)
            break
        end
end

else
i=0
j=1
loop do
`xmlstarlet ed -L -s "/MetasploitV5/hosts/host/vulns/vuln/vuln_attempts" -t elem -n "vuln_attempt" -v "" -s "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[last()]" -t elem -n "module" -v "auxiliary/scanner/ssh/ssh_login" "/root/#{target}.xml"`
`xmlstarlet ed -L -i "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']["#{j}"]/module" -t elem -n username -v "#{sshuser[i]}" "/root/#{target}.xml"`
`xmlstarlet ed -L -i "//MetasploitV5/hosts/host/vulns/vuln/vuln_attempts/vuln_attempt[module='auxiliary/scanner/ssh/ssh_login']["#{j}"]/module" -t elem -n password -v "#{sshpass[i]}" "/root/#{target}.xml"`
        i += 1
    j += 1
                if (i == sshuser.length)
                       break
                end
end
end
end

if ($?.success?)
    File.delete("/root/pwdump.txt")
end
end

Для каждой строки pwdump.txt это проверяет, существует ли шаблон S SH. Если это так, это строка pu sh имеет sh га sh, где ключом является переменная creds sh с инкрементным номером, а значением являются имя пользователя и пароль из этой строки. Затем файл pwdump.txt снова открывается. Если has sh ha sh имеет несколько строк, он делит их на два столбца: один go на массив sshuser, содержащий имена пользователей, и другой массив sshpass, содержащий пароли.

Затем проверяется, если XML содержит элемент поддерева vuln_attempt с именем module со значением ssh_login. Если он существует, l oop создает ниже элемент vuln_attempt, проиндексированный переменной j, поле пароля с паролем из первого элемента массива sshpass и обновляет поле имени пользователя с элементом имени пользователя массива sshuser. Оба индексируются переменной i. И так далее для каждого элемента из этих массивов.

В противном случае он сначала создает элемент поддерева vuln_attempt с именем module со значением ssh_login в последней позиции, а затем создает два поля для имени пользователя и passord из этих массивов.

...