Tag: API

  • What to do when your Twitter Account gets Compromised

    Despite employing strong passwords that I change regularly, despite deleting unsolicited Direct Messages (DM) and mentions with links to unknown destinations, a simple “fat finger faux pas” event lead to me granting a 3rd party Twitter application permission to spam my followers. For that I apologize — and as part of my penance, have provided some useful advice, images and even a script to help you remedy that situation if you should ever similarly fall victim so such malware.What to do when your Twitter account gets hacked

    I woke up a little after 1:30AM last night because I though I had heard some racoons helping themselves to my  trash can as if it were a salad bar. Once that venture into suburban sanitation security was resolved, I checked my Samsung Droid Charge for any incoming notifications.  One that caught my attention read:

    Strange link via DM from you just now.

    As I dug in, I realized that my Twitter Followers were being sent a DM with a link to a third party Twitter Application, which when clicked, would begin the process of similarly turning their Twitter account into a spam-sending zombie.

    First thing first, I read the instructions on Twitter’s help page entitled “My Account Has Been Compromised, ” which advised me to:

    1. Change your password (go ahead, make it  a strong password)
    2. Revoke connections (to any 3rd party application you think suspicious &/or are no longer used)
    3. Update your new password in your trusted third-party applications

    Which I did immediately. I then went into Twitter and began to manually delete the messages the pusilanimous 3rd party program had sent. It wasn’t long into this tedious process that I realized “… this is how I got hacked, the malware link is WAY too close to the delete link.”  I’ve attached a screenshot of a test DM to demonstrate the usability issue I’m trying to describe:

    How the Twitter delete DM links can sometimes be too close to a malware link

    A bit of context, earlier in the evening while watching the 1st quarter of the Packers/Falcon’s game, I received an obvious malware DM. I pulled up Twitter in my browser on my Droid rather than the mobile App because there’s less keystrokes to deleting such conversations. Unfortunately, I clicked the Malware link. I remember that happened because I quickly hit the back key and then deleted — not thinking anything would happen because of my miscue.

    I was wrong. Later, sometime during the 4th quarter while searching stats on the Pack’s stunning 2nd half comeback, I saw on my little Droid browser a page that looked like Twitter, asking me to log back in. I was busy with the game, I’d seen Twitter do this before. What I didn’t see that the link was  actually pointing to a misspelled site: Twittler.com!

    So despite all my talk about strong passwords, ignoring unsolicited candy from strangers, and other such stuff, I granted a 3rd party application permission to spam the h-e-double-toothpicks out of my followers. Worse, just about the time I was through deleting all the rogue messages, I received another communique that reminded me that followers who get email notifications of DMs were still going to see the link.

    So at about 2:45AM, I set out to write a script that would send DM notifications to all my Twitter Friends — technically, those individuals of whom I follow, who also follow me. I won’t go into too much gory detail, other than the resulting replies indicated grateful followers, who while suspicious, were glad to get the personalized Direct Message warning from me.

    I chose PERL, because while other languages may be better for long term projects, I knew I could field a solution within an hour and a half by taking advantage of the Net::Twitter module provided at the CPAN library; along with a fresh set of API consumer and access from the Twitter Developer’s page.

    I call this script “DM_mea_culprit.pl,” and since it can be used to send a bulk messages to all your Twitter followers, please resist temptation and limit its use it for good:

    #!/usr/bin/perl
    #
    # Summary:
    # --------------------------------------------
    # Sends a Direct Message to Friends - those people on Twitter
    # whom I follow who also follow me
    #
    # Arguments:
    # --------------------------------------------
    # none yet, we'll get that done on the next version
    #
    # Example Use:
    # ---------------------------------------------
    # perl DM_mea_culprit.pl > run01.log.txt
    
    use Net::Twitter;
    use Dumper;
    
    # NOTE: you will need to get consumer keys and access tokens from the
    # Twitter Development Center: https://dev.twitter.com/start
    my $nt = Net::Twitter->new(
    traits => [qw/API::REST OAuth/],
    consumer_key => $YOUR_CONSUMER_KEY,
    consumer_secret => $YOUR_CONSUMER_SECRET,
    access_token => $YOUR_ACCESS_TOKEN,
    access_token_secret => $YOUR_ACCESS_TOKEN_SECRET,
    );
    
    # this information is useful to log at the beinning of the script
    # .. it includes how many more messages you can send w/in the hour
    my $ratelimit = $nt->rate_limit_status();
    print Dumper($ratelimit);
    
    # construct the outgoing direct message
    my $omsg = "please do NOT open any URL you may have received from me last night as a DM. It was malware.";
    
    # get all the ID's of people I follow
    my @ids;
    for ( my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor} ) {
    # for a larger net, consider followers_ids()
    $r = $nt->friends_ids({ cursor => $cursor });
    push @ids, @{ $r->{ids} };
    }
    
    # walk through all the IDs
    foreach my $id (@ids) {
    if($id) {
    
    # get an array that describes the friendship
    my $friend = $nt->lookup_friendships({ user_id => $id });
    
    # get their screen name
    my $screenname = $friend->[0]->{"screen_name"};
    
    # see how you're connected to this friend
    my $connections = $friend->[0]->{"connections"};
    
    # important -- do they follow you?
    my $isfollowedby = $connections->[1];
    
    if($isfollowedby) {
    my $dmsg = "\@$screenname, $omsg"; # personalize the DM
    my $smsg = $nt->new_direct_message($id, $dmsg); # send the DM
    if($smsg) {
    print "message '$dmsg' successfully sent to #ID".$id."\n";
    } else {
    print "WRN:".$id."\t@".$screenname."\texperienced a message fail\n";
    }
    sleep (2); # don't overrun Twitter
    }
    sleep(3); # don't get blacklisted
    }
    }
    
    # Now send out a generalized message to the peeps;
    my $res = $nt->update({ status => "TO MY FOLLOWERS: $omsg" });
    
    # last bit of logging
    print "This work is done\n";
    exit 1;
    

    All that said,  here are some things I’m doing to do moving forward to avoid such instances.

    1. continue to change my password periodically, using something very strong;
    2. periodically review my third-party application connections, removing anything that looks suspicious and/or is no longer in use;
    3. always use the Twitter Mobile App to delete DMs with bad looking URLs when on my Droid smartphone;
    4. take a harder look at the URL when asked to log back into Twitter (or Facebook for that matter);
    5. perfect the above script — adding logic to delete spammy DM’s while sending out the warning; and
    6. being the Social Media API junkie that I am, perhaps re-write this in Python.

    Please feel free to add your recommendations to the list above — and again — apologies to my Twitter followers for the hassle.