Archive for November 2010
pianobar is epic!
@mrbarrett just pointed me at pianobar, a command-line client for pandora. It gets rid of the need for flash player, and allows you to bypass some of the limitations of the web client (you can skip more than 5 songs!).
To install (on Ubuntu):
sudo apt-get install git-core libao-dev libfaad-dev libmad0-dev git clone git://github.com/PromyLOPh/pianobar.git cd pianobar make sudo make install
enjoy!
Loading only the Metasploit modules you use
The framework is taking quite a while to load on my machine these days, so i decided to stop loading all modules by default, and load only those modules i need. Here’s the process:
Simply comment the module-loading lines in the framework file lib/msf/base/simple/framework.rb, so :
if (Msf::Config.module_directory) framework.modules.add_module_path(Msf::Config.module_directory) end
becomes
#if (Msf::Config.module_directory) #framework.modules.add_module_path(Msf::Config.module_directory) #end
Or you can apply this patch: http://www.0x0e.org/x/framework-no-default-mods.patch
Alos make sure to remove the ~/.msf3/modcache directory.
Then, mirroring the framework modules directory structure, copy the modules you’d like to load into your .msf3/modules directory. For example, if you wanted to load only the psexec module and the reverse_tcp payload, copy
- modules/exploits/windows/smb/psexec.rb into ~/.msf3/modules/exploits/windows/smb/psexec.rb
- modules/payloads/stagers/windows/reverse_tcp.rb into ~/.msf3/modules/payloads/stagers/windows/reverse_tcp.rb
You should now see a load-time speed improvement on the order of:
Before:
<pre>jcran@disko:~/framework$ time ./msfconsole -r exit.rc
| | _) |
__ `__ \ _ \ __| _` | __| __ \ | _ \ | __|
| | | __/ | ( |\__ \ | | | ( | | |
_| _| _|\___|\__|\__,_|____/ .__/ _|\___/ _|\__|
_|
=[ metasploit v3.5.1-dev [core:3.5 api:1.0]
+ -- --=[ 630 exploits - 310 auxiliary
+ -- --=[ 215 payloads - 27 encoders - 8 nops
=[ svn r10985 updated today (2010.11.11)
resource (exit.rc)> exit
resource (exit.rc)> exit
real 0m42.750s
user 0m40.710s
sys 0m0.820s</pre>
After:
<pre>jcran@disko:~/framework$ time ./msfconsole -r exit.rc
o 8 o o
8 8 8
ooYoYo. .oPYo. o8P .oPYo. .oPYo. .oPYo. 8 .oPYo. o8 o8P
8' 8 8 8oooo8 8 .oooo8 Yb.. 8 8 8 8 8 8 8
8 8 8 8. 8 8 8 'Yb. 8 8 8 8 8 8 8
8 8 8 `Yooo' 8 `YooP8 `YooP' 8YooP' 8 `YooP' 8 8
..:..:..:.....:::..::.....::.....:8.....:..:.....::..::..:
::::::::::::::::::::::::::::::::::8:::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
=[ metasploit v3.5.1-dev [core:3.5 api:1.0]
+ -- --=[ 1 exploits - 0 auxiliary
+ -- --=[ 1 payloads - 0 encoders - 0 nops
=[ svn r10985 updated today (2010.11.11)
resource (exit.rc)> exit
resource (exit.rc)> exit
real 0m12.232s
user 0m11.340s
sys 0m0.510s</pre>
Not huge, but definitely an improvement.
IP List to KML generator (Create a google map from a list of IPs)
Pretty simple, it takes a file with a list of ips, one/line and generates a kml file. Very handy if you’re working on a large pentest and want to track down (and visualize) where a particular host is located. It uses the Yahoo GeoIP API to grab location data.
#!/usr/bin/ruby
require 'net/http'
require 'rexml/document'
include REXML
def getAddress(ip)
#takes an ip and returns an xml blob with city/state
# example: http://ipinfodb.com/ip_query.php?ip=65.23.23.33
url = "http://ipinfodb.com/ip_query.php?ip=" + ip
#puts "DEBUG: URL: #{url.to_s}"
resp = Net::HTTP.get(URI.parse(url))
#print "DEBUG: got " + resp
return resp
end
def getCoordinates(address)
#takes a hash with city, state address and returns a hash w/ coords
url = "http://local.yahooapis.com/MapsService/V1/geocode"
params = {
"appid" => "GwLDY.bV34HH7gkBDs97p_5U5P_tBfXBnfDyYFwpTRLwZDEvgj8BOQqws1JOCFPyhTQR",
"street" => "",
"city" => address["city"],
"state" => address["state"]
}
#puts "DEBUG: URL: #{url.to_s}"
resp = Net::HTTP.post_form(URI.parse(url), params)
resp_text = resp.body
#print "DEBUG: got " + resp_text
return resp_text
end
def parseAddress(xml)
#takes an xml blob with city / state & returns a hash with address,city,state
doc = Document.new xml
root = doc.root
city = root.elements["City"].get_text.to_s
state = root.elements["RegionName"].get_text.to_s
country = root.elements["CountryCode"].get_text.to_s
#puts "DEBUG: city: " + city
#puts "DEBUG: state: " + state
#puts "DEBUG: country: " + country
toReturn = Hash["city" => city, "state" => state, "country" => country]
return toReturn
end
def parseCoordinates(xml)
#takes an xml blob with coordinates & returns a hash with long/lat
doc = REXML::Document.new xml
root = doc.root
long = REXML::XPath.first( doc, "//Longitude" ).get_text.to_s
lat = REXML::XPath.first( doc, "//Latitude" ).get_text.to_s
toReturn = Hash["long" => long, "lat" => lat]
#puts "DEBUG: long: " + long
#puts "DEBUG: lat: " + lat
return toReturn
end
def genKML(ips)
kml = ""
kml = kml + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
kml = kml + "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n"
kml = kml + "<Document>\n"
ips.each do |ip|
ip = ip.to_s.chomp
kmlplacemark = mip(ip,"error.log")
if kmlplacemark.to_s != "" then
# puts "DEBUG: adding non-blank placemark" + kmlplacemark
kml = kml + kmlplacemark
else
# puts "DEBUG: unable to map ip: " + ip + "\n"
end
end
kml = kml + "</Document>\n"
kml = kml + "</kml>\n"
end
def genPlacemark(ip,address,coordinates)
xml = ""
xml = xml + " <Placemark>\n"
xml = xml + " <name>" + ip + "</name>\n"
xml = xml + " <description>"
xml = xml + address["city"] + ", "
xml = xml + address["state"] + ", "
xml = xml + address["country"]
xml = xml + "</description>\n"
xml = xml + " <Point>\n"
xml = xml + " <coordinates>" +
coordinates["long"] + "," +
coordinates["lat"] + ",0</coordinates>\n"
xml = xml + " </Point>\n"
xml = xml + " </Placemark>\n"
end
def mip(ip,errorfile)
begin
if (ip != "") then
xmlAddress = getAddress(ip)
objAddress = parseAddress(xmlAddress)
if (objAddress["state"] != "") then
xmlCoordinates = getCoordinates(objAddress)
objCoordinates = parseCoordinates(xmlCoordinates)
kmlplacemark = genPlacemark(ip,objAddress,objCoordinates)
else
File.open(errorfile, 'w') {|f| f.write(ip) }
end
end
rescue
kmlplacemark = ""
end
return kmlplacemark
end
def mips(file)
counter = 0
ips = Array.new
File.open(file, "r") do |infile|
while (line = infile.gets)
#puts "mapping #{counter}: #{line}"
ips[counter] = line
counter = counter + 1
end
end
kml = genKML(ips)
return kml
end
kml = mips(ARGV[0])
out = File.new(ARGV[0]+".kml", "w")
out.puts kml