The best way that I learn languages, is to give myself a task, and force myself to write a script/program that carries out that task. Well, in this case, I’ve been wanting to change some aspects of EyeWitness, and decided that porting EyeWitness to Ruby would be a great way to make those changes, and learn a new language. After @harmjoy suggested that I look into learning Ruby, I decided to dive in and get it done. Now, about two months of working on it, I’m happy to say the EyeWitness Ruby port is ready for its initial release.
To view and download EyeWitness, head to my Github account, or click here!
I will continue to keep the Python version of EyeWitness available, as there are a few differences between the two versions of EyeWitness. These differences are:
- Screenshot Library – By adding an additional library for capturing screenshots, the user can switch between the two in the event that one library encounters an issue when capturing select websites.
- The Python version of EyeWitness uses Ghost to take screenshots of websites. One of the benefits of this is that it can run headlessly. However, I have seen an issue when given 3000+ websites, Ghost can freeze. Also, Robin Wood (@digininja) pointed out that EyeWitness can completely crash while screenshotting websites. This looks to be due to a potential file descriptor leak within Ghost. Even though I rarely hit these issues, I still wanted a solution/alternative. An alternative has been implemented in the Ruby version.
- The Ruby version uses Selenium for capturing screenshots. Specifically, Selenium-Webdriver will start up an instance of your web browser (default firefox), and use the web browser to navigate and screenshot web pages. For this first release, the ruby version is ONLY supporting Firefox (or a fork like Ice Weasel). Future releases will support other browsers, such as Chrome.
- User Agent Switching
- The Ruby version of EyeWitness does not currently have the ability to dynamically switch user agents for every URL and perform the same comparison checks that the Python version can carry out. This is because EyeWitness would have to instantiate a new selenium-webdriver object for every user agent, and that takes place in the form of a new web browser opening up. I believe it would be more of a hassle/distraction to have a large number of web browsers open, so I have not implemented it in the Ruby version. However, if this is needed, you can still use the user agent switching functionality within the Python version.
- File Input
- The Ruby version of Eyewitness requires you to specify the file type you are using as input. If using Nmap XML output for EyeWitness, you will have to use the –nmap flag, for nessus, the –nessus flag.
- Skip Sorting
- The Ruby version has a –skip-sort flag. This will tell EyeWitness not to group similar pages together, and just write out the report as it goes, vs. writing the report at the end after sorting all pages.
These seem to be the major differences within the two versions for the time being. I personally believe the Ruby implementation of EyeWitness will be better to use for assessments. If you encounter any issues, please be sure to report them to me!