Example #1
0
        private void convertButton_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(pstOutputPath.Text) || string.IsNullOrEmpty(folderInputPath.Text))
            {
                MessageBox.Show("Please select both paths !");
                return;
            }



            RDOSession session = new RDOSession(); // throws exception 1

            session.LogonPstStore(pstOutputPath.Text);
            RDOFolder folder = session.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);

            string[] fileEntries = Directory.GetFiles(folderInputPath.Text, "*.eml");


            foreach (string filePath in fileEntries)
            {
                RDOMail mail = folder.Items.Add("IPM.Mail");
                mail.Sent = true;
                mail.Import(filePath, 1024);
                // folder.Items.Add(mail);
                mail.Save();
            }

            session.Logoff();


            MessageBox.Show("Done converting !");
        }
 private void AddFilesToFolder(List <MailItem> files, RDOFolder folder)
 {
     if (files != null && files.Any())
     {
         foreach (MailItem mailItem in files)
         {
             RDOMail mail = folder.Items.Add("IPM.Mail");
             mail.Sent = true;
             mail.Import(mailItem.FullPath, 1024);
             // folder.Items.Add(mail);
             mail.Save();
         }
     }
 }
        public static void ExtractPstFolder(RDOFolder folder, string folderPath)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (folderPath == null)
            {
                throw new ArgumentNullException("folderPath");
            }

            if (folder.FolderKind == rdoFolderKind.fkSearch)
            {
                return;
            }

            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }

            foreach (RDOFolder child in folder.Folders)
            {
                ExtractPstFolder(child, Path.Combine(folderPath, ToFileName(child.Name)));
            }

            foreach (var item in folder.Items)
            {
                RDOMail mail = item as RDOMail;
                if (mail == null)
                {
                    continue;
                }

                mail.SaveAs(Path.Combine(folderPath, ToFileName(mail.Subject)) + ".eml", rdoSaveAsType.olRFC822);
            }
        }
Example #4
0
        static void Main(string[] args)
        {
            // <3 visual studio
            string origpath   = Path.GetFullPath(@"..\..\..\backup.pst");      // Just full of spam
            string targetpath = Path.GetFullPath(@"..\..\..\..\snapshot.pst"); // This will be the challenge

            // Copy over the original pst
            File.Copy(origpath, targetpath, true);

            // Have to use Redemption for this, since outlook is "secure"
            // Open the PST
            RDOSession session = new RDOSession();

            session.LogonPstStore(targetpath);

            // Load the target inbox
            RDOFolder inboxFolder = session.GetFolderFromPath("PRIVATE INBOX");
            RDOItems  inbox       = inboxFolder.Items;

            inbox.Sort("ReceivedTime", false); // Pre-sort them in ascending order
            Console.WriteLine(inbox.Count);

            // Encode the flag in DateTimes, hiding it in the year (2000 + c)
            // e.g. 3/9/2102 12:45:54 AM ==> 102 => 'f'
            var flag = "flag{w1k1L3ak5_g0T_n0tH1ng_0n_m3}".Select(c => EncodeChar(c)).ToList();

            // fun
            var aliases  = Cycle(aliasStrings).GetEnumerator();
            var subjects = Cycle(subjectStrings).GetEnumerator();

            // Approximately space out the emails
            int range = inbox.Count / flag.Count;

            for (int i = 0; i < flag.Count; i++)
            {
                // Copy the delivery time from a random email in this range
                DateTime recvTime = inbox[rand.Next(i * range, (i + 1) * range)].ReceivedTime;
                DateTime flagtime = flag[i];
                Console.WriteLine($"{flagtime} => {recvTime}");

                // Create a fake email with the two times and other fun stuff
                RDOMail flagmail = inbox.Add("IPM.Note");
                flagmail.Importance   = 1;
                flagmail.ReceivedTime = recvTime;
                flagmail.SentOn       = flagtime;
                flagmail.Subject      = subjects.Next();
                flagmail.To           = "*****@*****.**";
                flagmail.Sender       = session.GetAddressEntryFromID(session.AddressBook.CreateOneOffEntryID(aliases.Next(), "SMTP",
                                                                                                              "*****@*****.**",
                                                                                                              false, false));
                flagmail.Save();
            }

            // Sort the emails by delivery time, scattering the spoofed ones (in order) across the dump
            inbox = inboxFolder.Items;
            Console.WriteLine(inbox.Count);
            inbox.Sort("ReceivedTime", false);

            // Guess we're doing it this way -__-
            Console.WriteLine("Flag is in place, moving to inbox...");
            RDOFolder targetInbox = session.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);

            foreach (RDOMail email in inbox)
            {
                email.CopyTo(targetInbox);
            }
            targetInbox.Save();
            Console.WriteLine("Done!");
        }
Example #5
0
 //private void StoreOnNewMail(string entryId)
 //{
 //    const string SOURCE = CLASS_NAME + "StoreOnNewMail";
 //    RDOMail mail = null;
 //    try
 //    {
 //        Logger.Verbose(SOURCE,"fired");
 //        return;
 //        mail = Store.GetMessageFromID(entryId);
 //        if (mail == null) return;
 //        //intercept Message Updated
 //        if (IsUpdateMessage(mail))
 //        {
 //            ThreadPool.QueueUserWorkItem(DeleteNewMail, entryId);
 //            return;
 //        }
 //        //check for our headers
 //        if (mail.MessageClass == Resources.message_class_CM
 //            || !Utils.HasChiaraHeader(mail))
 //            return;
 //        Logger.Info(SOURCE, string.Format(
 //            "updating message class on {0} in {1}",
 //            mail.Subject, Store.Name));
 //        mail.MessageClass = Resources.message_class_CM;
 //        mail.Save();
 //    }
 //    catch
 //    {
 //        mail = null;
 //    }
 //    finally
 //    {
 //        if (mail != null) Utils.ReleaseObject(mail);
 //    }
 //}
 private bool IsUpdateMessage(RDOMail mail)
 {
     const string SOURCE = CLASS_NAME + "IsUpdateMessage";
     if (!mail.Subject.Equals(ThisAddIn.UPDATE_SUBJECT,
         StringComparison.CurrentCultureIgnoreCase)) return false;
     if (!mail.UnRead) return false;
     //ignore if more than 1 day old
     if (mail.SentOn.AddDays(1) < DateTime.Now) return false;
     Logger.Verbose(SOURCE, string.Format(
         "evaluating {0} in {1}", mail.Subject, Store.Name));
     //extract data from internet message header
     var pointer = "";
     var sender = "";
     var server = "";
     var port = "";
     Utils.ReadUpdateHeaders(mail, ref sender, ref pointer, ref server, ref port);
     Logger.Verbose(SOURCE, string.Format(
         "found {0} for {1} from {2} in {3}", pointer, mail.Subject, sender, Store.Name));
     return true;
 }
Example #6
0
 private static string GetHeader(RDOMail item, string header)
 {
     try
     {
         var propTag = item.GetIDsFromNames(ThisAddIn.PS_INTERNET_HEADERS, header) | ThisAddIn.PT_STRING8;
         return Convert.ToString(item.Fields[propTag]);
     }
     catch
     {
         return string.Empty;
     }
 }
Example #7
0
 internal static void ReadUpdateHeaders(RDOMail item, ref string senderAddress,
     ref string contentPointer, ref string serverName, ref string serverPort)
 {
     const string SOURCE = CLASS_NAME + "ReadUpdateHeaders";
     try
     {
         var prop = item.Fields[MAPITags.PR_TRANSPORT_MESSAGE_HEADERS];
         if (prop == null || string.IsNullOrEmpty(Convert.ToString(prop)))
         {
             var contentProp = item.Fields[ThisAddIn.MAIL_HEADER_GUID + Resources.update_header_pointer.ToLower()];
             var serverNameProp= item.Fields[ThisAddIn.MAIL_HEADER_GUID + Resources.update_header_server.ToLower()];
             var serverPortProp = item.Fields[ThisAddIn.MAIL_HEADER_GUID + Resources.update_header_port.ToLower()];
             var senderProp = item.Fields[ThisAddIn.MAIL_HEADER_GUID + Resources.update_header_sender.ToLower()];
             contentPointer = contentProp == null
                 ? string.Empty
                 : Convert.ToString(contentProp);
             if (string.IsNullOrEmpty(contentPointer)) return;
             serverName = serverNameProp == null
                 ? string.Empty
                 : Convert.ToString(serverNameProp);
             serverPort = serverPortProp == null
                 ? string.Empty
                 : Convert.ToString(serverPortProp);
             senderAddress = senderAddress == null
                 ? string.Empty
                 : Convert.ToString(senderProp);
             return;
         }
         var headerBlock = prop.ToString();
         //parse the headers
         var headers = new Dictionary<string, string>();
         var array = Regex.Split(headerBlock, @"(\r\n(?!\s))");
         foreach (var t in array)
         {
             if (t.Equals("\r\n")) continue;
             var pos = t.IndexOf(':');
             if (pos <= 0) continue;
             var header = t.Substring(0, pos).Trim().ToLower();
             //some headers may be duplicated?
             if (headers.ContainsKey(header)) continue;
             var value = t.Substring(pos + 1).Trim();
             headers.Add(header, value);
         }
         //Content-Pointer
         headers.TryGetValue(Resources.update_header_pointer.ToLower(), out contentPointer);
         //must have content pointer to be legit
         if (string.IsNullOrEmpty(contentPointer)) return;
         //Server-Name
         headers.TryGetValue(Resources.update_header_server.ToLower(), out serverName);
         //Server-Port
         headers.TryGetValue(Resources.update_header_port.ToLower(), out serverPort);
         //sender
         headers.TryGetValue(Resources.update_header_sender.ToLower(), out senderAddress);
     }
     catch (Exception ex)
     {
         Logger.Error(SOURCE, ex.ToString());
     }
 }
Example #8
0
 internal static bool HasChiaraHeader(RDOMail item)
 {
     if (!string.IsNullOrEmpty(GetHeader(item, Resources.content_header)))
         return true;
     //if that fails try parsing the mail header
     object prop;
     try
     {
         prop = item.Fields[ThisAddIn.PR_MAIL_HEADER];
     }
     catch
     {
         prop = null;
     }
     if (prop == null) return false;
     var header = Convert.ToString(prop);
     //only need Content-Pointer header to be legal
     return header.ToLower().Contains(
         Resources.content_header.ToLower());
 }