1 00:00:06,300 --> 00:00:09,100 I think that's for real this time. 2 00:00:15,390 --> 00:00:18,090 Can everybody hear me? 3 00:00:18,090 --> 00:00:19,290 Okay. 4 00:00:19,770 --> 00:00:21,950 Thank you for coming. 5 00:00:21,950 --> 00:00:23,190 Good afternoon. 6 00:00:23,190 --> 00:00:28,610 I am Wes Brown, and this is Scott Dunlap, my partner. 7 00:00:28,690 --> 00:00:34,530 And we both do security research as an interest. 8 00:00:34,890 --> 00:00:46,050 And we have previously worked in security industry as penetration testers and security assessment and application assessment and all that. 9 00:00:48,150 --> 00:00:51,210 What is Mosquito? 10 00:00:52,250 --> 00:01:03,570 Mosquito is a lightweight framework to deploy and run code remotely and securely in the context of penetration tests. 11 00:01:03,570 --> 00:01:10,570 It makes a best effort to ensure that the communication is secure. 12 00:01:11,050 --> 00:01:21,170 Special care is taken to ensure that deployed code is not stored outside of process memory space. 13 00:01:21,610 --> 00:01:29,690 It protects the confidentiality and trade secrets of code that is deployed and run on the target. 14 00:01:29,690 --> 00:01:33,610 This could be an exploit or a methodology. 15 00:01:33,610 --> 00:02:00,510 From past experience with working with proprietary zero days, I have hesitated to puddle jump using the exploit because I'm afraid of losing control of the exploit, that somebody could be eavesdropping or somebody could be watching the file system for the exploit. 16 00:02:00,870 --> 00:02:13,970 And I cannot ensure that they can do file recovery on the disk, but this way we can ensure that the exploit only remains in memory, the process space. 17 00:02:13,970 --> 00:02:21,270 At no time is the exploit written to disk unless you swap. 18 00:02:22,070 --> 00:02:26,330 That's one case we can't really control if you force a swap. 19 00:02:31,270 --> 00:02:34,350 I have discussed the why. 20 00:02:34,370 --> 00:02:43,730 Often it is desirable to leverage zero day code, but doing so in an uncontrolled fashion can have repercussions. 21 00:02:44,720 --> 00:02:54,530 Many processes have trade secrets and methodologies distilled in the form of audit and exploit code that they would like to keep out of a target's hands. 22 00:02:55,810 --> 00:03:09,590 Also very important is one problem I've had with many exploits is it transmits data and control information in the clear. 23 00:03:09,590 --> 00:03:17,770 And if I transmit the control and data in the clear, I am endangering my client. 24 00:03:19,390 --> 00:03:29,870 I mean, using Netcat and all that is great, but you're sending your client confidential data over a clear text connection. 25 00:03:29,870 --> 00:03:32,910 So that's one problem I'm hoping to resolve. 26 00:03:35,190 --> 00:03:39,470 Well, here we have a technical overview. 27 00:03:39,470 --> 00:03:47,800 We have written proof-of-concept code to prove that this idea works. 28 00:03:48,390 --> 00:03:51,210 The interpreter is Lua. 29 00:03:51,210 --> 00:03:58,780 Many of you may know Lua as an extension language for games like World of Warcraft. 30 00:04:00,160 --> 00:04:10,920 We use a synchronous cipher called RSA, which all of you know is used for the initial handshaking between the client and server. 31 00:04:12,240 --> 00:04:16,120 It's a computationally expensive operation. 32 00:04:16,120 --> 00:04:32,540 So once handshaking is done, we move to a synchronous cipher called ISAC where we trade a cipher and the clone and drone communicate by a synchronous cipher. 33 00:04:33,260 --> 00:04:37,600 Another component is entropy generation. 34 00:04:37,600 --> 00:04:44,640 Cryptography is worthless without good entropy, without a good pseudorandom number generator. 35 00:04:46,200 --> 00:04:51,160 As you may have figured out, we use a console drone model. 36 00:04:52,320 --> 00:04:56,670 One big plus is this code is extremely portable. 37 00:04:56,840 --> 00:05:05,160 We have personally tested and built on Win32, OpenBSD for Intel 386, and Darwin. 38 00:05:05,160 --> 00:05:11,490 By testing on Darwin, Mac OS X, we have resolved any Indian issues. 39 00:05:11,960 --> 00:05:19,580 By ordering Indian issues between 32-bit, 64-bit, or RISC and CISC platforms. 40 00:05:22,320 --> 00:05:24,590 Why did we pick Lua? 41 00:05:25,140 --> 00:05:28,690 It is a lightweight and powerful procedural language. 42 00:05:29,080 --> 00:05:32,060 It is easily extensible with bindings. 43 00:05:32,060 --> 00:05:36,550 We have created bindings for RSA and OpenSSL. 44 00:05:38,140 --> 00:05:44,120 It is bytecode compiled, which is a plus when you're trying to deploy code. 45 00:05:44,580 --> 00:05:47,160 It is highly portable. 46 00:05:47,160 --> 00:05:50,000 It is written in straight ANSI C. 47 00:05:50,280 --> 00:05:54,540 And it has run on PalmPilot without any changes. 48 00:05:55,380 --> 00:05:57,420 It is easy to learn. 49 00:05:57,420 --> 00:06:01,920 It takes about one hour to learn if you already know a procedural language. 50 00:06:04,360 --> 00:06:08,760 Moving on, we need to talk about the asynchronous cipher. 51 00:06:09,760 --> 00:06:18,960 As I've said before, the asynchronous cipher is used for initial negotiation and handshaking of secure channels. 52 00:06:19,420 --> 00:06:26,640 We pick RSA because it is well known in the cryptographic community. 53 00:06:26,920 --> 00:06:31,700 While it has weaknesses, these weaknesses are known. 54 00:06:31,860 --> 00:06:36,980 And that is more important to us than trying out some new cipher. 55 00:06:36,980 --> 00:06:43,860 We investigated elliptic curve cryptography, and we might enable that. 56 00:06:43,860 --> 00:06:46,220 But RSA is a known quantity. 57 00:06:47,680 --> 00:06:56,140 We use 4096-bit keys for the handshaking, so it is very unlikely that you will crack it. 58 00:06:58,000 --> 00:07:18,000 For the synchronous cipher, we ran into issues when we were looking for a synchronous cipher because many of them had packet problems and packet implementation or copyright problems. 59 00:07:18,000 --> 00:07:22,240 But we found one that we like, and it is ISAC. 60 00:07:22,240 --> 00:07:28,660 It is a synchronous cipher used for console and drone communication, the actual communication itself. 61 00:07:28,660 --> 00:07:37,080 Once the synchronous keys are changed, the stream cipher is one byte at a time. 62 00:07:37,080 --> 00:07:40,640 It is very fast and very safe. 63 00:07:42,940 --> 00:07:52,620 And one of the nice things is we can use a large key, 182-bit, because ISAC does not penalize you for stealing the key. 64 00:07:52,620 --> 00:07:58,640 We could use a 16-bit key, a 32-bit key, and it would make no difference. 65 00:07:58,660 --> 00:08:01,940 To computational performance. 66 00:08:04,100 --> 00:08:18,000 Now, along with the good, we will be remiss as security researchers that we need to talk about the bad things about our proof of concept, and that is entropy generation. 67 00:08:18,280 --> 00:08:22,640 It is essential to good cryptographic security. 68 00:08:23,220 --> 00:08:27,940 The problem is it uses OS facilities for entropy. 69 00:08:28,660 --> 00:08:34,960 The pseudorandom number generator in many operating systems are not very good at all. 70 00:08:35,880 --> 00:08:40,500 But on unit machines, we use devurandom. 71 00:08:40,700 --> 00:08:44,540 How good it is depends on the unit's derivative. 72 00:08:44,840 --> 00:08:47,940 OpenBSD, not surprisingly, is very good. 73 00:08:50,080 --> 00:08:56,620 We use Windows 2000, and HP has a very good cryptographic library. 74 00:08:56,620 --> 00:09:02,960 And because we use the OS facilities as a possible avenue of attack. 75 00:09:02,960 --> 00:09:07,080 We will probably investigate this in more detail. 76 00:09:08,980 --> 00:09:17,060 The cryptography library we're using, LibTomCrypt, has some entropy generation functions, but they are too slow. 77 00:09:17,380 --> 00:09:23,100 When we tested it, it took two minutes to generate entropy. 78 00:09:26,780 --> 00:09:30,760 Mosquito is divided into several components. 79 00:09:30,760 --> 00:09:37,700 We got the core, which provides the basic functionality required by a drone and console. 80 00:09:39,140 --> 00:09:46,660 A drone provides a remote process that contacts a matched console. 81 00:09:46,940 --> 00:09:55,060 And to execute scripts and commands that the console sends to it over the secure channel. 82 00:09:55,060 --> 00:10:01,190 A console provides a local process that controls the deployed drone. 83 00:10:01,740 --> 00:10:08,180 One of the neat features that we put in Mosquito is transport. 84 00:10:08,300 --> 00:10:14,500 And it's an abstracted way to connect the drone and the console. 85 00:10:14,500 --> 00:10:18,020 I'll talk about that more in a bit. 86 00:10:19,200 --> 00:10:21,520 Let's talk about core. 87 00:10:21,520 --> 00:10:29,860 Core is really nothing more than an augmented neural interpreter extended with the following functionalities. 88 00:10:29,860 --> 00:10:40,600 We have RSA encryption functions, ISAC encryption functions, networking functions, entropy gathering functions, and structured buffered functions. 89 00:10:42,440 --> 00:10:48,320 The drone is the Mosquito component that is deployed onto the target machine. 90 00:10:48,320 --> 00:10:56,820 It integrates the core with drone-only functionality, meaning it's a superset of the core. 91 00:10:57,980 --> 00:11:03,480 It executes Lua code sent by secured communication. 92 00:11:03,620 --> 00:11:11,280 And Lua code sent by the console is stored only in process memory. 93 00:11:11,280 --> 00:11:13,500 It is not stored on a disk. 94 00:11:15,920 --> 00:11:23,520 The console is the Mosquito component that provides a local process that controls the deployed drone. 95 00:11:24,040 --> 00:11:28,240 It integrates the core with console-only functionality. 96 00:11:28,240 --> 00:11:30,320 It's a superset of the core. 97 00:11:31,560 --> 00:11:36,340 The user uploads code to the drone by secured communication. 98 00:11:37,040 --> 00:11:44,380 And even more neat is the user can also interact with the drone in real time. 99 00:11:44,680 --> 00:11:48,660 We can interact with the Lua interpreter remotely. 100 00:11:48,940 --> 00:11:54,640 So you can do debugging and you can do code on the fly on the drone. 101 00:11:58,100 --> 00:12:05,300 Transport is an abstract functionality for the console and the drone to communicate with each other. 102 00:12:05,300 --> 00:12:13,580 It transparently negotiates a communication channel between the drone and the console and provides a read and write method. 103 00:12:14,260 --> 00:12:16,580 And read and write are separate. 104 00:12:19,100 --> 00:12:27,640 And it's really neat because we can do different transport methods for different channels. 105 00:12:27,640 --> 00:12:32,260 We have HTTP transport which is implemented by default. 106 00:12:32,260 --> 00:12:42,580 But we have skeleton code to implement DNS transport, ICOMP transport, UDP transport, HTTP transport. 107 00:12:42,580 --> 00:12:53,340 So if you could send HTTP in the pacifier wall but you can only go out by ICOMP, you can do that. 108 00:12:53,340 --> 00:13:00,020 You can send a message by HTTP and go out by ICOMP. 109 00:13:00,020 --> 00:13:03,320 You can mix and match however you want. 110 00:13:05,520 --> 00:13:08,300 Affiliation is handshaking. 111 00:13:08,400 --> 00:13:16,500 It's a process of identifying endpoints as valid to each other that they are who they are. 112 00:13:17,580 --> 00:13:20,760 And it sends a passphrase to each other. 113 00:13:20,760 --> 00:13:28,980 So unless somebody gets a hold of a drone, it's very hard to intercept. 114 00:13:30,620 --> 00:13:38,160 And during the handshaking, they are changing synchronous keys for ISAC. 115 00:13:41,480 --> 00:13:47,180 This is the outline of the flow of console affiliation. 116 00:13:47,180 --> 00:13:49,180 We have... 117 00:13:51,960 --> 00:13:58,960 When console affiliation begins, it starts and waits for the drone to contact it. 118 00:13:59,440 --> 00:14:16,320 And if it times out, we actually have a timeout feature because we don't want it to go for too long where other people may intercept the drone and modify it and then do whatever evil things they want to do with it. 119 00:14:17,180 --> 00:14:22,060 So we would have maybe a one-minute timeout or a 30-second timeout. 120 00:14:23,970 --> 00:14:28,430 And we have a drone in a secret mattress. 121 00:14:28,940 --> 00:14:33,180 It generates the key to send to the drone. 122 00:14:33,180 --> 00:14:37,500 And that's the key that the drone is going to use to send to the console. 123 00:14:38,100 --> 00:14:42,200 And then we got the console affiliation mode. 124 00:14:42,540 --> 00:14:45,220 The drone mode is a little more simple. 125 00:14:45,220 --> 00:14:47,620 It generates the key. 126 00:14:47,920 --> 00:14:51,520 It sends its handshake to the console. 127 00:14:51,900 --> 00:14:55,420 And in that affiliation, it sends its key. 128 00:14:55,520 --> 00:14:58,980 And then it awaits the response from the console. 129 00:14:59,020 --> 00:15:02,120 If it times out, the poop is gone. 130 00:15:03,940 --> 00:15:13,500 And then if the console sequence matches, then it enters operation mode where the console can send Lua commands to the drone. 131 00:15:15,900 --> 00:15:20,360 One of the neatest things about Mosquito is the build environment. 132 00:15:20,400 --> 00:15:25,720 The virtual machine is statically linked for easy deployment in a project. 133 00:15:25,740 --> 00:15:30,260 It's to ensure that all libraries that are needed to function are available. 134 00:15:32,140 --> 00:15:35,000 Gloob is a deep Lua script. 135 00:15:35,000 --> 00:15:51,060 It takes the executable file, the stub, with the binary C code functions like the virtual machine, the interpreter, the socket library, the cryptography library. 136 00:15:51,060 --> 00:15:59,740 And then it will attach the scripts in bytecode format to the end of the executable. 137 00:16:00,360 --> 00:16:11,560 And when the executable runs, it will go through the bytecode and have all the functions defined in the payload. 138 00:16:11,720 --> 00:16:14,720 So there's two ways to get code in the drone. 139 00:16:14,720 --> 00:16:21,640 One is to embed it in the drone, and the other is to send it over the network. 140 00:16:22,020 --> 00:16:30,600 So if you have library functions that you're not concerned about, you can put it in the drone itself and have them available for all penetration tests. 141 00:16:31,100 --> 00:16:34,680 But then you can have exploit functions used for library code. 142 00:16:38,280 --> 00:16:42,800 Now, we have some ways to attack Mosquito. 143 00:16:43,040 --> 00:16:47,660 We have introspective debugging. 144 00:16:47,660 --> 00:16:54,140 If somebody is sitting on the machine with sharp eyes, there's not much we can do about it. 145 00:16:55,880 --> 00:17:00,040 As I've discussed, they use entropy attacks. 146 00:17:00,040 --> 00:17:09,440 And if you are fast enough, you can modify the drone binary itself before it's invoked. 147 00:17:09,440 --> 00:17:21,740 But you have to be very, very quick, because the interval between the drone being deployed and being invoked is very short. 148 00:17:21,740 --> 00:17:24,400 Two, three, four seconds at most. 149 00:17:25,290 --> 00:17:31,460 And, of course, there's always cryptography attacks, known test attacks. 150 00:17:33,580 --> 00:17:36,840 There are some neat uses of the framework. 151 00:17:36,840 --> 00:17:44,800 As is, we can refactor exploits into Lua for security deployment on the target. 152 00:17:45,260 --> 00:17:47,520 It is easily extensible. 153 00:17:47,520 --> 00:17:50,700 Additional cryptographic methods are transformed. 154 00:17:52,020 --> 00:17:56,260 We can write port scan code. 155 00:17:56,260 --> 00:18:00,900 We can write SMB scan code and deploy it on the drone. 156 00:18:01,820 --> 00:18:09,520 So if you deploy the drone, you have all your exploit code, all your functionalities there. 157 00:18:11,080 --> 00:18:21,760 It will also simplify the deployment of auditing tools if you have one VM for all the platforms you attack. 158 00:18:23,460 --> 00:18:27,820 All the dependencies are included with the drone. 159 00:18:28,100 --> 00:18:35,200 When we deploy a drone, we have functions that will detect the target architecture. 160 00:18:35,200 --> 00:18:38,880 Look in the stub library of executables. 161 00:18:38,880 --> 00:18:49,560 We have a Win32 executable, we have a Darwin executable, and then we have an OpenBSD executable. 162 00:18:49,560 --> 00:19:02,120 It will detect that, take the stub, latch on all the Lua library code you want, and on the fly stream it to be deployed. 163 00:19:02,120 --> 00:19:11,400 That's one of the neat things we can use with Glue, because not only is Glue a script, it's also a library function in Mosquito. 164 00:19:13,260 --> 00:19:17,020 We have some future ideas that we could use. 165 00:19:17,020 --> 00:19:23,420 One of the neatest ideas would be an integral high-speed packet snipper and generation in the drone. 166 00:19:23,680 --> 00:19:30,380 That would be great for port scanning or listening to traffic and interpreting the traffic. 167 00:19:32,120 --> 00:19:38,300 One thing that we wanted to do, but weren't able to do yet, was drone-to-drone relay. 168 00:19:39,040 --> 00:19:44,220 You've got the console, you've got the drone, and then you've got another drone. 169 00:19:45,120 --> 00:19:51,320 And the communication is relayed through the drones as many times as you want. 170 00:19:51,320 --> 00:19:59,100 But at no time does any of the drones in between know what's happening at the endpoint drone. 171 00:19:59,100 --> 00:20:02,440 Because we've got nested encryption. 172 00:20:02,960 --> 00:20:14,560 When you've got the endpoint drone sending a... it's got its own key that only the console knows, it's passed and encrypted again and passed and encrypted again. 173 00:20:14,560 --> 00:20:18,320 Remember, ISAT has no penalty. 174 00:20:19,040 --> 00:20:22,460 So you can nest it as many times as you want. 175 00:20:23,240 --> 00:20:30,720 And we would like to do further refinement of the automated configuration and drone console pairs. 176 00:20:31,360 --> 00:20:35,900 And consoles that can manage multiple drones. 177 00:20:35,900 --> 00:20:38,780 Right now we can only manage one drone. 178 00:20:41,300 --> 00:20:42,180 Who are we? 179 00:20:42,180 --> 00:20:43,900 Got work for us? 180 00:20:44,860 --> 00:20:47,100 I'm Wes Brown. 181 00:20:47,260 --> 00:20:51,280 I'm a security consultant and security researcher. 182 00:20:51,640 --> 00:20:57,080 And Scott Dunlop is a software engineer and security researcher. 183 00:20:57,340 --> 00:21:02,960 He's more of a software engineer while I'm more of a consultant type. 184 00:21:03,460 --> 00:21:06,620 We are available in activity-seeking work. 185 00:21:06,620 --> 00:21:12,880 Wes is particularly interested in full-time employment as a security researcher. 186 00:21:13,880 --> 00:21:18,440 We have a website, fmosecurity.com. 187 00:21:18,440 --> 00:21:24,040 Worldwideweb.fmosecurity.com if you want more information. 188 00:21:28,460 --> 00:21:30,730 Got any questions? 189 00:21:32,230 --> 00:21:39,890 Tomorrow we will be putting the entire framework code on SourceForge. 190 00:21:39,890 --> 00:21:42,190 It is under the BSD license. 191 00:21:42,190 --> 00:21:44,630 Feel free to do whatever you want with it. 192 00:21:46,790 --> 00:21:48,710 And that's it. 193 00:21:56,690 --> 00:22:02,710 Scott will be taking the questions because I'm deaf and I can't hear the audience. 194 00:22:03,230 --> 00:22:06,350 We didn't bring any binoculars so we could lip-read. 195 00:22:06,830 --> 00:22:07,910 Yes? 196 00:22:11,150 --> 00:22:14,450 The 0.2 footprint was about 160k. 197 00:22:14,450 --> 00:22:19,490 We hadn't done any optimizations with the C compiler flags. 198 00:22:19,490 --> 00:22:22,870 We were hoping to target for about 80 to 90k. 199 00:22:22,870 --> 00:22:30,450 We were encountering some problems with the fact that we have to bundle most of our dependencies with the actual drone. 200 00:22:30,450 --> 00:22:33,230 We're not making any assumptions about availability of things. 201 00:22:33,230 --> 00:22:41,070 We're just assuming standard C live in the case of Win32, you know, the standard DLLs. 202 00:22:41,610 --> 00:22:46,630 The current 0.3 is a little bit heftier because we put in live TomCrypt. 203 00:22:46,630 --> 00:22:51,370 And a lot of TomCrypt is very easy to strip down. 204 00:22:51,370 --> 00:22:53,290 We just haven't had a chance to do it. 205 00:22:55,470 --> 00:22:56,590 Sure. 206 00:23:05,070 --> 00:23:10,530 We are supplying a general purpose socket library called LuaSocket. 207 00:23:12,330 --> 00:23:22,870 It's not quite performing up to the standard that we'd like, but the goal was to provide the ability to do further network penetration and auditing from the drone. 208 00:23:22,890 --> 00:23:31,770 Very often in audit you have a situation where you've managed to breach an edge system and you need to get deeper in now that you're past the firewall. 209 00:23:32,070 --> 00:23:34,290 And to see where you can go once you've gotten into the bastion. 210 00:23:35,170 --> 00:23:37,030 And that was kind of the purpose of the drone. 211 00:23:38,110 --> 00:23:39,190 Yes. 212 00:23:48,590 --> 00:23:57,830 We certainly kicked around the idea of abusing some of the DRM APIs in Windows XP. 213 00:23:57,830 --> 00:24:00,490 Unfortunately most Unixes don't provide these. 214 00:24:00,730 --> 00:24:06,470 OpenBSD does provide some functionality for preventing writing into swap space. 215 00:24:06,890 --> 00:24:09,930 But that is one of our more major vulnerabilities. 216 00:24:09,930 --> 00:24:14,830 This is a possibility of later analysis of the swap file. 217 00:24:22,920 --> 00:24:26,320 Unfortunately I don't have a console running on Win32. 218 00:24:26,320 --> 00:24:27,800 I haven't linked one. 219 00:24:29,040 --> 00:24:33,940 I've got the Macs, but they're not cooperating with the projector today. 220 00:24:34,680 --> 00:24:36,440 It's very embarrassing. 221 00:24:40,790 --> 00:24:42,670 Oh, I'm sorry. 222 00:24:42,690 --> 00:24:43,550 Yes. 223 00:24:51,020 --> 00:24:55,260 We are relying on libtomcrypt, which is fairly simple. 224 00:24:55,260 --> 00:24:57,180 It's configurable and can be stripped down. 225 00:24:57,180 --> 00:24:59,440 And of course Lua, as you mentioned. 226 00:25:01,500 --> 00:25:06,740 And our only other major dependencies have been just Lua extensions. 227 00:25:07,100 --> 00:25:11,320 The stuff that we've added in, structure buffer and everything else, are actually pretty simple. 228 00:25:11,940 --> 00:25:17,180 If there are buffer overfunds in Lua, that is a problem. 229 00:25:17,180 --> 00:25:19,180 However, the way the construction works... 230 00:25:20,320 --> 00:25:29,320 Once the drone has been deployed, there's a fixed window which is configurable of how long the drone has to contact the console. 231 00:25:30,040 --> 00:25:38,500 The first one to contact and correctly complete affiliation within that window basically gets the connection. 232 00:25:38,520 --> 00:25:46,520 After that, we drop the listen socket and basically we just run with that one transport until it dies. 233 00:25:46,520 --> 00:25:50,900 So buffer overrun exposure is pretty minimal. 234 00:25:50,900 --> 00:25:57,520 As you mentioned, there's always a possibility of someone trying to respond before the affiliation goes through. 235 00:25:57,520 --> 00:26:04,480 But unless there's some kind of very specialized IDS, I don't see that happening. 236 00:26:04,840 --> 00:26:10,720 We were investigating how to deploy this by shellcode. 237 00:26:10,720 --> 00:26:17,760 And if we can do this, then we would have no drone in the file system at all to intercept. 238 00:26:17,760 --> 00:26:23,980 It would be in the process memory of whatever program we buffer overran. 239 00:26:29,860 --> 00:26:31,540 Any other questions? 240 00:26:33,780 --> 00:26:36,720 I've got to cover for a time not having a demo. 241 00:26:39,770 --> 00:26:45,290 Well, you're always free to email the questions to the address over there. 242 00:26:46,350 --> 00:26:54,810 And of course, the code itself will be available for your inspection tomorrow at SourceForge. 243 00:26:54,810 --> 00:26:57,230 We will deploy it to SourceForge. 244 00:27:02,480 --> 00:27:10,460 Well, once you put something on SourceForge, barring intervention by lawyers, it's there pretty much permanently. 245 00:27:10,480 --> 00:27:16,500 Matter of fact, their policies are pretty strict about not taking something back out in the public domain once you put it there. 246 00:27:17,900 --> 00:27:20,120 So once it's there, it's there. 247 00:27:21,240 --> 00:27:22,280 Yes? 248 00:27:26,700 --> 00:27:28,960 It really depends on public interest. 249 00:27:28,960 --> 00:27:33,440 I don't have an active use for Mosquito, Wes does. 250 00:27:33,720 --> 00:27:43,920 It was basically my entertainment here was just getting it out in the open and just basically I wanted to see what everybody thought of the idea and the actual algorithm. 251 00:27:45,080 --> 00:27:49,620 Wes, of course, considers it a more usable tool because it's more in his line. 252 00:27:57,120 --> 00:27:58,240 Is that all? 253 00:27:58,860 --> 00:27:59,880 I guess. 254 00:28:00,220 --> 00:28:02,440 Thank you for the loan for the laptop. 255 00:28:04,020 --> 00:28:05,620 Thank you for the patience.