Archive

Archive for the ‘Code’ Category

Remove the facebook annoying seen label

June 12, 2012 Leave a comment

Do you like the new facebook “feature” that tell’s you when someone sees your messages?!

I think I can assume that only stalkers like this new feature… 🙂 I don’t like to put any pressure to reply my messages, and I don’t like when someone asks why I’m not replying.

TLDR – here

If you want to know how this is done, it’s very simple!

So every time you see a message your browser sends a request to a facebook page saying that you saw that message.

How do I find this things?!

Simply open chrome in debug mode and switch to Network, next use an account to send a message to you and see what shows when the seen message pops up on the other side. You’ll find something like this…

And this is it… All we have to do is to block this request and it’s done. 🙂

So how do I block this?!

It’s very simple if you are talking about chrome, can’t say about others because I’m not familiar with their extensions, on chrome you just need to filter the request using…

chrome.webRequest.onBeforeRequest

If you check the documentation you have an example that is almost exactly what you need.

chrome.webRequest.onBeforeRequest.addListener(
   function(details) { return {cancel: true}; },
   {urls: ["*://www.evil.com/*"]},
   ["blocking"]);

This simple code blocks any request going to http://www.evil.comso you need to change this piece of code to match the facebook url found earlier.

Something like this: “*://*facebook.com/ajax/mercury/change_read_status*” and it’s done!

So make your own plugin or download this one available on Chrome web store https://chrome.google.com/webstore/detail/oakagafhajhfmgaeekngfnhlbjjgoddo

python/sqlite Date

April 10, 2012 Leave a comment

I was doing some work with sqlite3 databases in python and got a few problems with dates.

First problem was with datetime.strptime. I was coding a multi-threaded algorithm and found the hard way that this function isn’t thread safe! And python returned an exception complaining about failing to obtain a lock (mutex).

Fix: Simply execute some command using datetime.strptime *before creating* any thread.

datetime.strptime(“2012-04-10 22:22:22″,”%Y-%m-%d %H:%M:%S”)

Second problem, after fixing the threads issue now python was returning a “ValueError: unconverted data remains:”. This is a simple fix, there was some part of the date string that was being ignored.

Fix: Use this as a format “%Y-%m-%d %H:%M:%S.%f”

For last my sqlite3 now was using a different time from my machine, after a small search found that if you are receiving dates from an external source to the sqlite3 engine you should add the “localtime” to the call.

Example:

  • strftime(‘%s’,’now’,’localtime’) – This returned GMT (my system time)
  • strftime(‘%s’,’now’) – This returned GMT -1 (maybe a default)

I hope this helps someone with the same problem 🙂

Obfuscating messages in pastebin.com

March 11, 2012 Leave a comment

A couple of days ago I was playing with pastebin, and started to “crawl” around in their website, at the same time I was reading a few news about botnets and decided to go deep into this subject, specifically their C&C. How they normally controlled the botnet using IRC channels, among others, there are a few nice references about this subject on the wiki page.

Then I was viewing some bots “pasting”. Some are clever, this is me guessing :), they even change their message structure or text to avoid hashing and add a very long list of TAGS at the end to make sure they popup on the results of any crawler. Others just send a very long list of links to download services.

So if you are monitoring the posts how do you prevent your crawler to index these messages? My solution was to look for common points, like blog links or some other characteristics. After analyzing some of these posts a thought crossed my mind and I mixed both subjects…

I thought that I could easily pass messages around pastebin that will be “ignored as spam” in most cases, using these spam messages to obfuscate the real content of the post. When I get something like this in my mind I wont rest until I get some results, positives or negatives…

So I decided to look even closer to the messages, and found two possibilities of doing this. Here’s a link to some spam messages that I found.

  1. On the first message we can use the TAG list as dictionary and hide the messages there.
  2. On the second we can use the link codes to hide the message, this means that a simple solution will not be able to give valid links to files, but it’s not impossible.

As I didn’t wanted to spend a lot of time on this subject I followed the first option.

First I got all the TAG’s from the message and created a list. To make this work I needed to be able to encode a TAG into a 0 to 255 value, so I started testing and ended up with this simple function:

# last - last key used, keyword - TAG
def makeKey(self,last,keyWord):
	# make a hash from the keyword
	key = hashlib.md5(keyWord+self.salt).hexdigest()
	# some operations that use the last value
	# to generate an index to a byte in key
	l=len(key)
	i=(last*1337)%(l/2)
	# get that byte
	byte=key[2*i:(2*i)+2]
	val=int("0x"+byte, 0)
	return val

Given the last calculated code and a keyword will generate the next code. I tested this function with the dictionary, adjusted a few things in the dictionary and created a few helper functions and was able to use the TAG’s to pass messages YEY!

In order to make the message pass as a normal spam message I still needed to add some more random TAG’s and add the normal spam text before the TAG’s.

At this point I was able to hide a message in an apparently “normal” spam message, and even pass multiple messages with different encodings or from the socket point of view, different ports.

But you only need to send a message if there is someone waiting for it 🙂 so I needed a way to distinguish these “special” messages from a “normal” message. I was already spending too much time in this subject, so I came up with a simple solution and made a checksum using the dictionary and inserted it in the first line of the message.

Please keep in mind that this was a code made in a few hours after work, and a proof of concept, so it may not be the best or the most pretty… 🙂

def checkHeader(self,control,header):
	spl=header.split(" ")
	try:
		spl.remove("")
	except ValueError:
		pass
	l=len(control)/2
	base=0
	sum=0
	for i in xrange(len(control)/2):
		x=(i*2)
		y=(i*2)+2
		seq = control[x:y]
		while(base<len(spl)):
			h=self.joinArray(spl[0:base+1])
			base+=1
			key = hashlib.md5(h).hexdigest()
			if(seq in key):
				sum+=1
				break
	if(sum==l and base==len(spl)):
		return True
	else:
		return False

def makeHeader(self,control,limit=50):
	while(True):
		header=""
		for i in xrange(len(control)/2):
			while True:
				header+=random.choice(self.keylist)+" "
				key = hashlib.md5(header).hexdigest()
				if(control[i*2:(i*2)+2] in key):
					break
		if(len(header)<=limit):
			return header

Now I was able to identify a message addressed for me from other messages. At this point I thought, well I did it, it’s possible, time to stop now! And I did stop, but I was talking to one of my friends and he convinced me to share this, I normally don’t do this I simply get over it and start thinking on something else…

But since he convinced me into sharing this, I decided to make the code more fun and made a simple shoutbox over pastebin. It’s not very easy to use because you’ll have to open a link and fill the captcha every time you send a message, it was not my objective to try to bypass pastebin spam control system.

Keep in mind that this is a proof of concept code, probably has many bugs in the obfuscating algorithms or they aren’t secure or fail in some cases. And I know that this isn’t a viable way of chatting or making a shoutbox due to many constraints.

BUT remember that I was doing this to try and pass hidden messages in normal spam messages, creating a system capable of sharing messages anonymously, under the subject of botnet C&C. By doing this little research I can conclude that ignoring spam may not be a solution in some forms of investigations. And I think that probably this was already thought and done or being used by someone else.

Without delay here you can find this simple code and some screen shots of it working.

https://github.com/lbragues/pasteshout

sslstrip mod to support plugins

December 4, 2011 Leave a comment

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

This is my modification of sslstrip to support plugins.
setup.py was removed so you cant install directly this version
use it only from the folder

I created this to help me on some tests I did, it got a lot easier. This code isn’t perfect, far from it…
For someone that hasn’t much experience in python this was made in record time… don’t be too hard on the errors
it might have.

Screen shots:

Starting sslstrip example

Some actions printed

Some more

Installing:

  • Do it like you where installing normaly sslstrip
  • Don’t use setup.py wont work. This is a experimental version.

Running:

  • To activate plugins add the -x or --s1plugin option in the command line

####### Plugin Info #########

File structure:
s1plugin
|____ plugins (All plugins are here)
|                 |____    _OSFinder (Plugin folders, each plugin has it’s own folder)
|____ * (All the other files, you don’t need to change anything)
It’s easy, so if you know what you are doing you shouldn’t have a problem understanding
if you can’t then don’t change anything 🙂

About plugins folder:

  • A plugin is only loaded if it’s folder HAS the file __init__.py
  • Deactivating a plugin Rename or remove “__init__.py”
  • To be loaded a Plugin must have a file named S1Plugin.py with a class named S1Plugin respecting the rules

Plugin class:

  • EventSender it’s an empty plugin, you want to create a new one use that and remove what you don’t need
  • What can you do and listen: (I think I don’t need to explain)
  1. onResolveHost(self,client,host,result)
  2. onHostResolvedSuccess(self,client,address)
  3. onHostResolvedError(self,client,error)
  4. onCleanHeaders(self,client,headers,result)
  5. onClientConnection(self,host,headers,client,path,postData,url)
  6. onSendSpoofedFaviconResponse(self,client,icon_path)
  7. onProxy(self,client,host, method, path, postData, headers, port, ssl)
  8. hijackConnection(self,client,url,clientConnection)
  9. onVisitUrl(self,client,url,postData)
  10. injectContent(self,client,contentType,data)
  • Store and read values on disk (settings.db) -> sqlite3
  1. storeValue(“key1″,”ohhyeah”)
  2. readValue(“key1”)
  • Communicate between plugins
  1. View _OSFinder and UrlLogger plugins for reference

Modifications on sslstrip.py:

Find this:
print “\nsslstrip ” + gVersion + ” by Moxie Marlinspike running…”
Here:
# —— SizeOne Mod —————————————
# import The event manager class if detected
if(os.path.exists(“s1plugin”)):
from s1plugin.S1StrippingProxy import S1StrippingProxy
#create replace normal classes
strippingFactory.protocol = S1StrippingProxy
# ———————————————————-

I think it’s all I have to say for now

More Info:
https://github.com/lbragues/sslstrip